OpenGL混合:顶部的纹理与其像素重叠,应该是透明的(alpha = 0)

时间:2015-07-30 09:44:08

标签: c++ opengl

我正在绘制一个地图纹理,并在其上面绘制一个颜色条纹理。两者都有alpha通道,我正在使用混合,设置为

// Turn on blending
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

但是,会发生以下情况:

texture on top with alpha channel imposes its black pixels

带有alpha通道的顶部纹理(颜色条)强加了黑色像素,我不想发生这种情况。地图纹理应出现在colorbar alpha = 0的后面。

这与混合定义有关吗?我该怎么改变它?

1 个答案:

答案 0 :(得分:2)

假设纹理具有alpha通道并且在正确的位置它是透明的,我怀疑问题在于渲染顺序和深度测试。

让我们假设您首先渲染比例纹理。它与黑色背景正确融合。然后渲染它后面的橙色纹理,但是缩放纹理中的像素具有更高的深度值,并导致那里的橙色纹理被丢弃。

因此,请确保您按照前面的顺序渲染所有透明的内容,或者最接近最近的内容。

如果没有订购独立透明度,alpha透明度的常用方法如下:

  1. 启用深度缓冲区
  2. 渲染所有不透明几何体
  3. 禁用深度写入(glDepthMask
  4. 启用Alpha混合(如OP代码中所示)
  5. 以最接近的顺序渲染透明几何体
  6. 对于粒子,你有时可以在没有分类的情况下离开,它看起来还不错。另一种方法是使用alpha测试或使用alpha覆盖与多重采样帧缓冲。