Loading PNG with stb_image for OpenGL texture gives wrong colors
alpha, c++, opengl, png, textures
Solution
Changing the STBI_rgb to STBI_rgb_alpha in the stbi_load function call fixed it.
Probably best not to specify RGB when its RGBA :D
Problem
I am using stb_image to load a 32-bit PNG file (RGBA) and I am creating an OpenGL texture with it. It works fine for 24-bit PNG files (with no alpha channel), but when I use a 32-bit PNG file, something goes wrong. This is what the texture should look like: And this is what it looks like when rendered with OpenGL (the black parts are meant to be transparent, and are when I enable blending): This is how I load the texture: ``` 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); ``` And these are the window parameters (using 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); ``` What is happening?