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

and*_*pcg 3 c++ opengl transparency alphablending

我正在尝试渲染部分不透明颜色和其他部分透明的纹理。

这是我的对象绘制函数:

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);

}
Run Code Online (Sandbox Code Playgroud)

问题是在透明部分它显示纯白色。我可以使用 glColor4f(1.0, 1.0, 1.0, 0.5) 使纹理透明,但这不是我想要的,因为它使整个纹理透明,而不仅仅是透明部分。

我检查过,我的纹理文件是具有透明度的PNG。

小智 9

在这里重述解决方案,以便其他人可以轻松找到它。

您的渲染代码似乎是正确的,因此问题似乎出在纹理加载代码上。加载纹理时,必须确保为内部纹理像素格式(GL_RGBA8、GL_RGBA16 等)以及源图像像素格式(GL_RGBA 或 GL_BGRA 等)传递正确的标志。