OpenGL 带有透明度(alpha)的纹理

3

我将尝试渲染一张部分具有不透明颜色和另一部分具有透明度的纹理。

以下是该对象的绘制函数:

void drawHighGrass(){
glDisable(GL_LIGHTING);
glClearColor(1.0, 1.0, 1.0, 1.0);
glColor4f(1.0, 1.0, 1.0, 1.0);

glDisable(GL_DEPTH_TEST);

glDepthMask(GL_FALSE);

glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);



glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, texturas[HIGH_GRASS]);

glPushMatrix();
//glTranslatef(1000, 0, 1000);
glBegin(GL_QUADS);
glTexCoord2f(0.0f, 0.0f); glVertex3f(0, 0, 0);
glTexCoord2f(1.0f, 0.0f); glVertex3f(100, 0, 0);
glTexCoord2f(1.0f, 1.0f); glVertex3f(100, 40, 0);
glTexCoord2f(0.0f, 1.0f); glVertex3f(0, 40, 0);
glEnd();

glPopMatrix();

glDisable(GL_TEXTURE_2D);

glEnable(GL_DEPTH_TEST);
glDisable(GL_BLEND);
glDepthMask(GL_TRUE);
glEnable(GL_LIGHTING);

}

问题在于透明部分显示为纯白色。我可以使用glColor4f(1.0, 1.0, 1.0, 0.5)使纹理透明,但这并不是我想要的,因为它会使整个纹理透明而不仅仅是透明部分。
我已检查过,我的纹理文件是带有透明度的PNG格式。

2
这听起来可能是纹理加载方式的问题。你加载纹理的代码是什么? - Maple
@Maple,你是对的,确实是纹理导入的问题。谢谢! - andrepcg
1个回答

8

这里重新说明解决方案,以便其他人可以轻松找到。

您的呈现代码似乎是正确的,所以问题似乎在于纹理加载代码。加载纹理时,必须确保传递正确的标志用于内部纹理像素格式(GL_RGBA8、GL_RGBA16等)以及源图像像素格式(GL_RGBA或GL_BGRA等)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接