Nieokreślony błąd w bibliotece OpenGL powodujący problem z wyświetlaniem tekstury.

0

Stworzyłem sobie klasę która wyświetla obraz.
Gdy ją wywołałem nic się nie pokazało więc sprawdziłem czy plik graficzny jest ładowany poprawnie.
Okazało się że tak więc użyłem glGetError() i okazało się, że to OpenGL ma jakiś błąd.
Sprawdziłem kod błędu, który wynosi 1280 - GL_INVALID_ENUM - tylko nie wiem co jest nie tak bo w funkcji nic nie zmieniałem.
Oto klasa testowa:

class Klasa{
public:
	Klasa(); // Konstruktor
	void Draw();
	~Klasa(); // Destruktor
};
Klasa::Klasa(){
}
void Klasa::Draw(){
    DrawTexture(100,100,100,100,SE);
}
Klasa::~Klasa(){
}

Jak już mówiłem - tzn. pisałem - sprawdziłem funkcje glGetError() i w tej wskazał błąd tylko nie wiem co jest przyczyną.

ILuint LoadTexture(ILuint & Texture, char *Path)
{
        // generowanie nazwy obrazu
	ilGenImages(1, &Texture); 

	// wybranie biezacego obrazu
	ilBindImage(Texture);

	// ladowanie obrazu z pliku
	ilLoadImage(Path);
	
	// konwertowanie tekstury
	if (ilGetInteger(IL_IMAGE_BITS_PER_PIXEL) == 24)ilConvertImage(IL_RGB, IL_UNSIGNED_BYTE);
        else if (ilGetInteger(IL_IMAGE_BITS_PER_PIXEL) == 32)ilConvertImage(IL_RGBA, IL_UNSIGNED_BYTE);

	// obsluga bledow
	if(ilGetError() != IL_NO_ERROR)return ilGetError();

	// generowanie nazwy tekstury
	glGenTextures( 1, & Texture );

	// wybranie biezacej tekstury
        glBindTexture( GL_TEXTURE_2D, Texture );

	// ustalenie parametrów tekstury
	glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
        glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
        glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);
        glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT);

	// ustalenie trybu teksturowania
	glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_REPLACE);

	// tworzenie tekstury
	glTexImage2D( GL_TEXTURE_2D, 0, ilGetInteger( IL_IMAGE_BPP ), ilGetInteger( IL_IMAGE_WIDTH ), 
          ilGetInteger( IL_IMAGE_HEIGHT ), 0, ilGetInteger( IL_IMAGE_FORMAT ), GL_UNSIGNED_BYTE, ilGetData() );
    
	//szybkie spr kodu bledu
	//itoa(glGetError(),Error,10);

	if(glGetError==GL_NO_ERROR )return IL_NO_ERROR;
}

Dlaczeo nagle w tej funkcji jest błąd - czy klasa mogła coś na mieszać?

0

Posprawdzałem trochę i wiem, że:

  • Wczytuje i poprawnie tworzy teksturę dla obrazu 'N.png' ( folder 'Graphic' w paczce ).
    Inne pliki są ładowane ale OpenGL ma problem ze stworzeniem dla nich tekstury.
  • Gdy próbuje wyświetlić plik funkcją z klasy to nic się nie dzieje
    natomiast gdy wyświetlam normalnie teksturę 'N' - bo tylko ona się ładuje poprawnie - to się wyświetla.

Może pliki graficzne są uszkodzone? Stworzyłem je w blenderze jeśli ma to znaczenie.
Sam już nie wiem co jest nie tak. Bardzo prosiłbym o pomoc w rozwiązaniu tego problemu.

http://www.sendspace.pl/file/599e6fce67362d77b263862

0

Udało mi się rozwiązać mój problem.
Problem tkwił w tym, że próbowałem ładować pliki o głębi 64 bity natomiast moja funkcja mogła ładować 24 i 32 bit.
DevIL ładował pliki ale dawał złe informacje o głębokości przez co OpenGL nie mógł utworzyć tekstury.
Wystarczyło zmodyfikować jedną linie w funkcji, która wygląda teraz tak:

ILuint LoadTexture(ILuint & Texture, char *Path)
{
        // generowanie nazwy obrazu
	ilGenImages(1, &Texture); 

	// wybranie biezacego obrazu
	ilBindImage(Texture);

	// ladowanie obrazu z pliku
	ilLoadImage(Path);
	
	// konwertowanie tekstury
	if (ilGetInteger(IL_IMAGE_BITS_PER_PIXEL) == 24)ilConvertImage(IL_RGB, IL_UNSIGNED_BYTE);
	else if (ilGetInteger(IL_IMAGE_BITS_PER_PIXEL) > 24)ilConvertImage(IL_RGBA, IL_UNSIGNED_BYTE); /* <-- Rozwiązanie problemu */

	// obsluga bledow
	if(ilGetError() != IL_NO_ERROR)return ilGetError();

	// generowanie nazwy tekstury
	glGenTextures( 1, & Texture );

	// wybranie biezacej tekstury
        glBindTexture( GL_TEXTURE_2D, Texture );

	// ustalenie parametrów tekstury
	glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
        glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
        glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);
        glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT);

	// ustalenie trybu teksturowania
	glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_REPLACE);

	// tworzenie tekstury
	glTexImage2D( GL_TEXTURE_2D, 0, ilGetInteger( IL_IMAGE_BPP ), ilGetInteger( IL_IMAGE_WIDTH ), 
		          ilGetInteger( IL_IMAGE_HEIGHT ), 0, ilGetInteger( IL_IMAGE_FORMAT ), GL_UNSIGNED_BYTE, ilGetData() );
    
	if(glGetError == GL_NO_ERROR )return IL_NO_ERROR;
	else return glGetError();
}

PS: Chciałbym podziękować wszystkim, którzy się tak pchali by mi pomóc.

1 użytkowników online, w tym zalogowanych: 0, gości: 1