gpt4 book ai didi

c++ - 为 OpenGL 纹理加载带有 stb_image 的 PNG 会给出错误的颜色

转载 作者:IT老高 更新时间:2023-10-28 21:50:15 25 4
gpt4 key购买 nike

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

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

纹理应该是这样的:

Texture

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

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

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

发生了什么?

最佳答案

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

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

如果您使用 STBI_rgbGL_RGBA,则必须在对 glTexImage2D 的调用中将格式设置为 GL_RGB如果你使用 STBI_rgb_alpha

其他读者的奖励

您是否有类似的问题,而上述方法仍然没有帮助?那么您的图像数据可能在 OpenGL 期望的对齐上没有行。在调用 glTexImage2D 之前尝试 glPixelStorei(GL_UNPACK_ALIGNMENT, 1);。见 https://www.khronos.org/opengl/wiki/Pixel_Transfer#Pixel_layout了解更多信息。

关于c++ - 为 OpenGL 纹理加载带有 stb_image 的 PNG 会给出错误的颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23150123/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com