繁体   English   中英

使用stb_image为OpenGL纹理加载PNG会产生错误的颜色

[英]Loading PNG with stb_image for OpenGL texture gives wrong colors

我正在使用stb_image加载一个32位的PNG文件(RGBA),我用它创建一个OpenGL纹理。

它适用于24位PNG文件(没有alpha通道),但是当我使用32位PNG文件时,出现问题。

这就是纹理应该是这样的:

质地

这就是使用OpenGL渲染时的样子(黑色部分是透明的,当我启用混合时):

错误的纹理

这是我加载纹理的方式:

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);

这些是窗口参数(使用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);

怎么了?

在stbi_load函数调用中将STBI_rgb更改为STBI_rgb_alpha会修复它。

可能最好不要在RGBA:D时指定RGB

您的实际错误是您使用comp来确定glTexImage2D formatGL_RBA / GL_RGBA )参数。 这是因为当您使用stbi_load加载图像时, comp返回的值将始终与源图像匹配,而不是返回的图像数据。

更具体地说,你的错误是你使用STBI_rgb ,导致stbi_load返回3字节像素,但是你用glTexImage2D加载它作为4字节像素与GL_RGBA因为当你加载32位图像时comp是4。

您必须设置的格式在调用glTexImage2DGL_RGB如果使用STBI_rgbGL_RGBA如果使用STBI_rgb_alpha

对其他读者的奖励

你有类似的问题,上面仍然无济于事吗? 那么你的图像数据可能没有OpenGL期望的对齐行。 试试glPixelStorei(GL_UNPACK_ALIGNMENT, 1); 在你调用glTexImage2D之前。 有关详细信息,请参阅https://www.khronos.org/opengl/wiki/Pixel_Transfer#Pixel_layout

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM