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:
Und das ist, wie es aussieht, wenn sie mit OpenGL gemacht (die schwarzen Teile sollen transparent sein, und sind, wenn ich enable Blending) :
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?
Dass dies funktioniert ist nur "Glück". Siehe meine Antwort. –