0

我正在尝试使用 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 是正确的。

该代码也适用于其他图像,如下所示,所以我不确定为什么这不起作用。

正确的图像

4

0 回答 0