2014-04-18 13 views
16

Ich verwende stb_image, um eine 32-Bit-PNG-Datei (RGBA) zu laden, und ich erstelle eine OpenGL-Textur mit ihm.Laden von PNG mit stb_image für OpenGL-Textur gibt falsche Farben

Es funktioniert gut für 24-Bit-PNG-Dateien (ohne Alpha-Kanal), aber wenn ich eine 32-Bit-PNG-Datei verwenden, geht etwas schief.

Dies ist, was die Textur sollte wie folgt aussehen:

Texture

Und das ist, wie es aussieht, wenn sie mit OpenGL gemacht (die schwarzen Teile sollen transparent sein, und sind, wenn ich enable Blending) :

Wrong Texture

Dies ist, wie ich die Textur laden:

int w; 
int h; 
int comp; 
unsigned char* image = stbi_load(filename.c_str(), &w, &h, &comp, STBI_rgb); 

if(image == nullptr) 
    throw(std::string("Failed to load texture")); 

glGenTextures(1, &m_texture); 

glBindTexture(GL_TEXTURE_2D, m_texture); 

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 

if(comp == 3) 
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, w, h, 0, GL_RGB, GL_UNSIGNED_BYTE, image); 
else if(comp == 4) 
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, image); 

glBindTexture(GL_TEXTURE_2D, 0); 

stbi_image_free(image); 

Und das sind die Fensterparameter (SDL)

SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 8); 
SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 8); 
SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 8); 
SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE, 8); 
SDL_GL_SetAttribute(SDL_GL_BUFFER_SIZE, 32); 
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); 
SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 16); 

Wer weiß, was passiert ist?

Antwort

18

Die Änderung von STBI_rgb zu STBI_rgb_alpha im Funktionsaufruf stbi_load wurde behoben.

Wahrscheinlich am besten nicht RGB angeben, wenn seine RGBA: D

+0

Dass dies funktioniert ist nur "Glück". Siehe meine Antwort. –

0

Ihr tatsächlicher Fehler ist, dass Sie comp verwenden Ihre format (GL_RBA/GL_RGBA) Parameter glTexImage2D zu bestimmen. Dies geschieht, weil beim Laden eines Bildes mit stbi_load der in comp zurückgegebene Wert immer dem Quellbild und nicht den zurückgegebenen Bilddaten entspricht.

Insbesondere Ihr Fehler ist, dass Sie STBI_rgb verwenden, wodurch stbi_load 3-Byte-Pixel zurück, aber dann laden Sie es mit glTexImage2D als 4-Byte-Pixel mit GL_RGBA weil comp 4 ist, wenn Sie ein 32-Bit-Bild laden.

Sie müssen das Format in Ihrem Anruf glTexImage2D-GL_RGB gesetzt, wenn Sie STBI_rgb und GL_RGBA verwenden, wenn Sie STBI_rgb_alpha verwenden.

Bonus zu anderen Lesern

Haben Sie ein ähnliches Problem und die oben hilft immer noch nicht? Dann haben Ihre Bilddaten möglicherweise keine Zeilen in der von OpenGL erwarteten Ausrichtung. Versuchen Sie glPixelStorei(GL_UNPACK_ALIGNMENT, 1);, bevor Sie glTexImage2D anrufen. Weitere Informationen finden Sie unter https://www.khronos.org/opengl/wiki/Pixel_Transfer#Pixel_layout.

Verwandte Themen