Uczę się OpenGL w C++ przy użyciu samouczków NeHe, ale próbuję zrobić to z biblioteką FreeImage, zamiast Glaux lub SOIL. Dobrym punktem, jaki widzę przy korzystaniu z FreeImage, jest jego ostatnia aktualizacja w październiku zeszłego roku, podczas gdy SOIL nie była aktualizowana od 5 lat. Problem polega na tym, że nie mogę poprawnie załadować tekstur.Jak załadować tekstury do OpenGL za pomocą biblioteki FreeImage?
Oto mój kod:
static GLuint texture = 0;
if (texture == 0)
{
FIBITMAP* bitmap = FreeImage_Load(
FreeImage_GetFileType("textures/test/nehe_06.png", 0),
"textures/test/nehe_06.png");
glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, 3, FreeImage_GetWidth(bitmap), FreeImage_GetHeight(bitmap),
0, GL_RGB, GL_UNSIGNED_BYTE, FreeImage_ConvertTo32Bits(bitmap));
FreeImage_Unload(bitmap);
}
Za pomocą tego kodu, tekstury mogę to źle: to czarny, z kolorowymi kropkami i paskami i zmienia obraz daje ten sam wynik, więc zakładam, że I” m nie ładuje poprawnie tekstury.
Próbowałem zamienić czerwony i niebieski bit (przeczytaj, że FreeImage ładuje się w BGR) bez lepszego wyniku. Na koniec, jeśli zmienię * FreeImage_ConvertTo32Bits (bitmap) * o * FreeImage_GetBits (bitmap) * otrzymam błąd segfault.
Co robię źle?
To nie będzie działać dla wszystkich obrazów ze względu na wymagania wyrównania Scanline. –
@SergeyK. W przypadku 32-bitowych pikseli wszystkie rozmiary linii skanowania są wyrównane do 4 bajtów. W jakich sytuacjach uważasz, że to nie zadziała? –