Png图像加载不正确.使用stbi_load()opengl



所以我有这个问题:我用stbi_load()加载图像,然后用glTexImage2D()创建纹理。加载.jpg图像时,一切正常,但加载.png时,绘制的图像是黑色的,应该是透明的。图片如下:WronglyDrawnPng 图片

这是我使用过的代码:

第一次设置纹理参数:

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_MIPMAP_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

然后我加载图片:

m_data = stbi_load(pathToTexture, &m_height, &m_width, &m_nrChannels, RGBA ? STBI_rgb : STBI_rgb_alpha);

最后,我创建了纹理和genarte mipMap:

glTexImage2D(GL_TEXTURE_2D, 0, RGBA ? GL_RGB : GL_RGBA, m_height, m_width, 0, RGBA ? GL_RGB : GL_RGBA, GL_UNSIGNED_BYTE, m_data);
glGenerateMipmap(GL_TEXTURE_2D);

RGBA是我在创建纹理类时设置的布尔

这也是我的碎片着色器:

#version 330 core
out vec4 OutFrag;
uniform vec3 color;
uniform sampler2D tex;
in vec2 TexPos;
void main()
{
OutFrag = vec4(color, 1.0)  * texture(tex, TexPos);
}

有人知道吗,为什么纹理绘制不正确?

正如Alan在评论中提到的,RGBA ? GL_RGB : GL_RGBA看起来不太安静。如果设置了RGBA布尔,是否要启用RGBA?如果是的话,这应该是CCD_ 8而不是CCD_。

如果RGBA标志被设置,则这将评估为GL_RGBA,否则将评估为GL_RGB。您当前的代码的作用正好相反。当然,这种相反的行为可能是故意的,尽管从标志名称RGBA来看似乎不太可能。

此外,您可能还希望启用混合。

尝试添加这两行

glEnable(GL_BLEND);

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

最新更新