Laden Sie ein Bild mit FreeImage
Ich versuche zu Folgen, eine OpenGL-tutorial, aber das tutorial verwendet BODEN (was bei mir nicht funktioniert) und ich benutze FreeImage.
Könnten Sie mir sagen, warum mein code nicht funktioniert?
Tutorial-code:
//Load texture
GLuint tex;
glGenTextures(1, &tex);
int width, height;
unsigned char* image = SOIL_load_image("sample.png", &width, &height, 0, SOIL_LOAD_RGB);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, image);
SOIL_free_image_data(image);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
Mein code:
//Load textures
GLuint tex;
glGenTextures(1, &tex);
int width, height;
FREE_IMAGE_FORMAT formato = FreeImage_GetFileType("sample.png",0);
FIBITMAP* imagen = FreeImage_Load(formato, "sample.png");
FIBITMAP* temp = imagen;
imagen = FreeImage_ConvertTo32Bits(imagen);
FreeImage_Unload(temp);
width = FreeImage_GetWidth(imagen);
height = FreeImage_GetHeight(imagen);
GLubyte* textura = new GLubyte[4*width*height];
char* pixeles = (char*)FreeImage_GetBits(imagen);
for(int j= 0; j<width*height; j++)
{
textura[j*4+0]= pixeles[j*4+2];
textura[j*4+1]= pixeles[j*4+1];
textura[j*4+2]= pixeles[j*4+0];
textura[j*4+3]= pixeles[j*4+3];
}
glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA, width, height, 0, GL_RGBA,GL_UNSIGNED_BYTE,(GLvoid*)textura );
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
Meine "Lösung" einfach die Ergebnisse in einem schwarzen Fenster (keine Fehler).
Du musst angemeldet sein, um einen Kommentar abzugeben.
Programmierung in C ist sehr lustig
Du bist Programmierer. Du solltest besser das Programm Debuggen, weil "schwarzer Bildschirm" im OpenGL-app kann verursacht werden, von zig verschiedenen Gründen. Aus unserer Sicht können wir nur raten. Und wir mögen es nicht.
Meine Vermutung
(okay, manchmal haben wir uns wie zu erraten)
Diese:
Ihre
temp
undimagen
Punkte auf derselben Stelle, also nachFreeImage_Unload(temp);
beiden Punkte zu... wir wissen nicht wo. Dann bekommst du die Pixel es:char* pixeles = (char*)FreeImage_GetBits(imagen);
Was bedeutet es gibt? Wir nicht' wissen. Sie müssen nicht überprüfen, ob
pixels
vorhanden ist, nach, dass.Undefiniertes Verhalten etc. Es schadet auch nicht, Absturz.
Auch, ANMUTIGEN, Sie können nicht Lesen und schreiben an der gleichen
dib
.Stattdessen tun:
(oder kommentieren Sie alle conversion-Zeug)
Wie debug:
.raw
- Datei (oder anderes format), und überprüfen Sie es mit bitmap-editor, Wie auf Fehler überprüfen:
Lesen Sie sorgfältig die FreeImage-Dokumentation und tutorial-Beispiele. Blick auf Fehler überprüfen Umsetzung. Im Grunde, Sie benötigen, um callback-Funktion. Implementieren es. Legen Sie es. (Oder zumindest copy-paste). Dasselbe tun +
glGetError()
für OpenGL.Happy coding! =)
Edit: FreeImage haben
SwapRedBlue32()
Helfer-Funktion, so brauchen Sie nicht diese for-Schleife.FreeImage_Rotate()
. Download Dokumentation von hier für details. Überprüfen Sie auchFreeImage_SetOutputMessage
Funktion. Also, das nächste mal werden wir nicht brauchen, zu erraten, wo Ihr code konnte =)imagen = FreeImage_FlipHorizontal(imagen)
in dieser situation? Weil ich kann nicht arbeiten, weil es ein Boolean zurückgibt. Mit dem drehen funktioniert, aber es ist vertikal gespiegelt, dann :/.bool result = FreeImage_FlipHorizontal(imagen);
es wird sich ändernimagen
im Ort, kein kopieren in eine andere variable. Vergessen Sie nicht zu prüfen, erors nach:if(!result) { /* Error message here*/ }
.Sie scheinen nie zu binden, das textur-Objekt, das Sie erstellen.
Hinzufügen
glBindTexture( GL_TEXTURE_2D, tex )
Anruf nachglGenTextures()
und wieder, bevor Sie versuchen, zu Rendern mit der textur.Okay, ich fand die Antwort auf meine Frage. 😛
Ich habe zu Beginn der Anwendung in der "Debug" - Ordner statt Debuggen mit VC++.
Problem ist nur, dass jetzt das pic geladen ist Kopf, aber ich glaube, ich könnte es beheben wenn ich die for-Schleife.
Danke für alle Antworten!
Right Click on Project
->Properties
->Debugging
->Working Directory
.