Chargement de la PNG avec stb_image pour OpenGL texture donne mal les couleurs
Je suis en utilisant stb_image de chargement d'un PNG 32 bits fichier (RGBA) et je suis entrain de créer une texture OpenGL.
Il fonctionne très bien, pour les 24-bit fichiers PNG (sans canal alpha), mais lorsque j'utilise un 32-bit fichier PNG, quelque chose va mal.
C'est ce que la texture doit ressembler à:
Et c'est à quoi il ressemble une fois rendu avec OpenGL (les parties noires sont destinés à être transparent, et quand je activer le mélange):
C'est comment j'ai charger la 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);
Et ce sont les paramètres de fenêtre (à l'aide de 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);
Ce qui se passe?
OriginalL'auteur developerbmw | 2014-04-18
Vous devez vous connecter pour publier un commentaire.
La modification de la STBI_rgb à STBI_rgb_alpha dans le stbi_load appel de fonction fixe.
Probablement préférable de ne pas spécifier RVB lors de son RGBA 😀
OriginalL'auteur developerbmw
Votre bug, c'est que vous utilisez
comp
pour déterminer votreformat
(GL_RBA
/GL_RGBA
) paramètreglTexImage2D
. Cela arrive parce que quand vous chargez une image à l'aide destbi_load
, la valeur retournée danscomp
toujours correspondre à la source de l'image, et non pas les données de l'image renvoyée.Plus précisément, votre bug, c'est que vous utilisez
STBI_rgb
, provoquantstbi_load
de retour de 3 octets pixels, mais alors vous devez le charger avecglTexImage2D
que 4 octets pixels avecGL_RGBA
parce quecomp
est 4 lorsque vous chargez un 32 bits de l'image.Vous devez définir le format à votre appel à l'
glTexImage2D
àGL_RGB
si vous utilisezSTBI_rgb
et àGL_RGBA
si vous utilisezSTBI_rgb_alpha
.Bonus pour d'autres lecteurs
Êtes-vous eu un problème similaire et ci-dessus n'aide pas? Ensuite vos données d'image peuvent ne pas avoir des lignes sur l'alignement OpenGL attend. Essayez
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
avant d'appelerglTexImage2D
. Voir https://www.khronos.org/opengl/wiki/Pixel_Transfer#Pixel_layout pour plus d'informations.OriginalL'auteur Sebastian Ärleryd