所以我有这个问题:我用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);