我正在尝试使用 stb 图像库将 RGBA 图像加载到 OpenGL 中。图像透明部分的下半部分显示为部分透明,而不是完全透明。我认为这可能与图像格式有关,但我不确定。
这是从 Gimp 获取的源图像:
这是输出:(请注意,我目前正在让着色器将 alpha 通道输出到红色通道中,所以红色意味着它是不透明的,黑色是透明的)
这是加载图像数据并创建纹理的代码:
unsigned int texture;
glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
int width, height, numChannels;
char *filename = "path/to/image.png";
unsigned char *data = stbi_load(filename, &width, &height, &numChannels, 0);
if (data)
{
GLint format = 0;
if (numChannels == 3) {
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
format = GL_RGB;
}
else if (numChannels == 4) {
format = GL_RGBA;
}
glTexImage2D(GL_TEXTURE_2D, 0, format, width, height, 0, format, GL_UNSIGNED_BYTE, data);
glGenerateMipmap(GL_TEXTURE_2D);
}
我目前正在将图像导出为每种颜色 8 位的 RGBA。我尝试了不同的格式,例如每种颜色 16 位、浮点颜色而不是整数颜色,但那些使情况变得更糟,所以我认为 8bpc 的 RGBA 是正确的。
该代码也适用于其他图像,如下所示,所以我不确定为什么这不起作用。