dev*_*bmw 21 c++ opengl png textures alpha
我正在使用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);
Run Code Online (Sandbox Code Playgroud)
这些是窗口参数(使用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);
Run Code Online (Sandbox Code Playgroud)
怎么了?
dev*_*bmw 23
在stbi_load函数调用中将STBI_rgb更改为STBI_rgb_alpha会修复它.
可能最好不要在RGBA:D时指定RGB
Seb*_*ryd 20
您的实际错误是您comp用来确定您的format(GL_RBA/ GL_RGBA)参数glTexImage2D.这是因为当您使用加载图像时stbi_load,返回的值comp将始终与源图像匹配,而不是返回的图像数据.
更具体地说,您的错误是您使用STBI_rgb,导致stbi_load返回3字节像素,但随后加载glTexImage2D4字节像素,GL_RGBA因为comp当您加载32位图像时为4.
您必须在调用中设置的格式glTexImage2D来GL_RGB,如果你使用STBI_rgb,并GL_RGBA如果您使用STBI_rgb_alpha.
对其他读者的奖励
你有类似的问题,上面仍然无济于事吗?那么你的图像数据可能没有OpenGL期望的对齐行.glPixelStorei(GL_UNPACK_ALIGNMENT, 1);在打电话之前试试glTexImage2D.有关详细信息,请参阅https://www.khronos.org/opengl/wiki/Pixel_Transfer#Pixel_layout.
| 归档时间: |
|
| 查看次数: |
26302 次 |
| 最近记录: |