Ich lerne OpenGL in C ++ mit NeHe-Tutorials, aber ich versuche, sie mit FreeImage-Bibliothek statt Glaux oder SOIL zu machen. Der gute Punkt, den ich bei der Verwendung von FreeImage sehe, ist die letzte Aktualisierung im Oktober letzten Jahres, während SOIL seit 5 Jahren nicht mehr aktualisiert wurde. Das Problem, das ich habe, ist, dass ich Texturen nicht richtig laden kann.
Hier ist mein Code:
%Vor%Mit diesem Code ist die Textur, die ich bekomme, falsch: sie ist schwarz, mit farbigen Punkten und Streifen, und das Ändern des Bildes führt zum gleichen Ergebnis, also nehme ich an, dass ich die Textur nicht richtig lade.
Ich habe versucht, die roten und blauen Bits (gelesen, dass FreeImage in BGR lädt) ohne besseres Ergebnis zu tauschen. Schließlich, wenn ich die * FreeImage_ConvertTo32Bits (Bitmap) * um * FreeImage_GetBits (Bitmap) * ändere, bekomme ich einen segfault.
Was mache ich falsch?
Es gibt zwei Probleme mit Ihrem Code - einer besteht darin, dass Sie in ein Bild mit 32 Bits konvertieren, aber Sie geben ein 24-Bit-Texturformat für openGL an ( GL_RGB
). Die zweite besteht darin, dass Sie das FreeImage-Objekt selbst an die Textur und nicht an die konvertierten Bits übergeben.
Sie müssen stattdessen so etwas tun
%Vor%Um die vorherige Antwort zu erweitern:
FreeImage_GetBits()
function gibt einen Zeiger auf die in einem FreeImage-internen Format gespeicherten Daten zurück. Dabei ist jede Scanline normalerweise auf eine 4-Byte-Grenze ausgerichtet. Dies funktioniert gut, wenn Sie Zwei-Potenz-Texturen haben. Für NPOT-Texturen müssen Sie jedoch die korrekte Entpackungsausrichtung für OpenGL angeben.
Es gibt eine weitere Funktion in FreeImage, mit der Sie ein nicht dicht gepacktes Array von Pixeln erhalten können: FreeImage_ConvertToRawBits()