DevIL - błąd ładowania obrazu.

0

Deklaruje dwie zmienne do przechowywania tekstury:

// deklaracja zmiennej na obraz
ILuint Grass = NULL;
ILuint Tower = NULL;

Potem ładuje tą funkcją:

ILuint LoadImage(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();
}

o tak:

void LoadTextures()
{
	LoadImage(Tower,".\\Graphics\\Tower.png");
	LoadImage(Grass,".\\Graphics\\Grass_01.png");
}

I na koniec wyświetlam:

DrawImage2D(64,64,960,540,Tower);

Funkcją:

void DrawImage2D(int x, int y, int WidthImage, int HeightImage, ILuint ImgID)
{
	// kasowanie tekstury
	glDeleteTextures(1, & ImgID);

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

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

	// 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() );

	// 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);

	// ustalenie koloru kwadratu 
	glColor3f( 0.0, 0.0, 0.0 );

	// rysowanie kwadratu pod teksture
	glBegin( GL_QUADS );

	  glTexCoord2f( 0, 0 );
          glVertex2f( x, y );

	  glTexCoord2f( 1, 0 );
          glVertex2f( x + WidthImage, y );

	  glTexCoord2f( 1, 1 );
          glVertex2f( x + WidthImage, y + HeightImage );
 
          glTexCoord2f( 0, 1 );
          glVertex2f( x, y + HeightImage );
	glEnd();
}

Problem w tym że jeśli załadowałem teksturę Tower a potem Grass to zamiast wieży mam trawę mimo, że chciałem wyświetlić wieżę.
Przed.png załadowaniem tekstury trawy a po jej załadowaniu otrzymuje Po.png mimo, że ciągle wyświetlam wieże.

Wniosek taki, że wyświetlam ostatnio załadowany obraz ale nie wiem czemu.

0

Ola boga :D Czemu za każdym razem, gdy rysujesz teksturę ładujesz ją do OpenGL? To się robi tylko raz. Zmienną którą używasz w glBindTexture - ImgID - musisz sobie gdzieś w programie zapamiętać i potem przed rysowaniem quada bindujesz tą teksturę.

Tak może wyglądać ładowanie tekstury:

		glEnable(GL_TEXTURE_2D);
		width=w;
		height=h;
		glPixelStorei(GL_UNPACK_ALIGNMENT,4);
		glGenTextures(1,&texID);
		glBindTexture(GL_TEXTURE_2D,texID);
		glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
		glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
		if (fixEdge) {
			glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE  );
			glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE  );
		} else {
			glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT  );
			glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT  );
		}

		glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, &image[0]);

CLAMP_TO_EDGE używam w grach 2D jak chcę wyświetlić pojedynczy obrazek - zapewnia, że 1.0 w TexCoord będzie "dokładne".

Zamiast DevIL użyłbym czegoś lżejszego http://lodev.org/lodepng/picopng.cpp
Do samego ładowania plików PNG nie potrzebujesz nic ponadto ;)

0

Ola boga :D Czemu za każdym razem, gdy rysujesz teksturę ładujesz ją do OpenGL? To się robi tylko raz.
Przecież tak robię ...

//deklaracja
int LT = 1;
//w funkcji display
if(LT == 1){LoadTextures();LT = 0;}

Zmienną którą używasz w glBindTexture - ImgID - musisz sobie gdzieś w programie zapamiętać i potem przed rysowaniem quada bindujesz tą teksturę.
Jak miałby wygłądać przykładowy kod/funkcja?

0

Ładujesz plik do pamięci raz DevIL'em, ale potem w DrawImage2D cały czas konwertujesz dane obrazu do OpenGL... tak się tego nie robi ;) Funkcja DrawImage2D powinna wyglądać tak:

        // ustalenie koloru kwadratu 
        glBindTexture(GL_TEXTURE_2D,texID);
        glColor3f( 0.0, 0.0, 0.0 );
 
        // rysowanie kwadratu pod teksture
        glBegin( GL_QUADS );
 
          glTexCoord2f( 0, 0 );
          glVertex2f( x, y );
 
          glTexCoord2f( 1, 0 );
          glVertex2f( x + WidthImage, y );
 
          glTexCoord2f( 1, 1 );
          glVertex2f( x + WidthImage, y + HeightImage );
 
          glTexCoord2f( 0, 1 );
          glVertex2f( x, y + HeightImage );
        glEnd();

Wszystkie parametry tekstury ustawiasz jednorazowo przed wywołaniem glTexImage2D, ale nie przy każdym przerysowaniu sceny. Samo ładowanie tekstury pokazałem w pierwszej odpowiedzi...

0

Dzięki mój za wskazówki...

ILuint LoadImage(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() );
}
void DrawImage(int x, int y, int width, int height, ILuint Texture)
{
        // wybranie biezacej tekstury
        glBindTexture( GL_TEXTURE_2D, Texture );

	// ustalenie koloru kwadratu 
	glColor3f( 1.0, 1.0, 1.0 );

	// rysowanie kwadratu pod teksture
	glBegin( GL_QUADS );

	  glTexCoord2f( 0, 0 );
          glVertex2f( x, y );

	  glTexCoord2f( 1, 0 );
          glVertex2f( x + width, y );

	  glTexCoord2f( 1, 1 );
          glVertex2f( x + width, y + height );

	  glTexCoord2f( 0, 1 );
          glVertex2f( x, y + height );

	glEnd();
}
void DrawImage(int x, int y, int z, int width, int height, ILuint Texture)
{
	// wybranie biezacej tekstury
        glBindTexture( GL_TEXTURE_2D, Texture );

	// ustalenie koloru kwadratu 
	glColor3f( 1.0, 1.0, 1.0 );

	// rysowanie kwadratu pod teksture
	glBegin( GL_QUADS );

	  glTexCoord2f( 0, 0);
          glVertex3f( x, y, z);

	  glTexCoord2f( 1, 0 );
          glVertex3f( x + width, y, z);

	  glTexCoord2f( 1, 1 );
          glVertex3f( x + width, y + height, z);

	  glTexCoord2f( 0, 1 );
          glVertex3f( x, y + height, z);

	glEnd();
}

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