我想渲染几个彼此透明的png文件。我只需要alpha值为1或0的“绝对透明”。

c++ - 避免写入Alpha值为0的深度缓冲区-LMLPHP

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


这就是我目前所拥有的,问题是即使alpha值为0,OpenGL仍然会写入深度缓冲区,如何避免这种情况?

我是否必须使用深度值对子画面进行排序?我目前正在按纹理ID对我的精灵进行分组,以减少纹理状态的变化。按深度值排序肯定会增加我的纹理状态变化。

最佳答案

您可以使用Alpha测试。

glEnable(GL_ALPHA_TEST);
glAlphaFunc(GL_GREATER, threshold);


仅当输入像素的alpha值大于阈值时才绘制像素。

在较新的OpenGL版本中不推荐使用此方法,但可以通过将以下内容添加到片段着色器中来轻松模拟:

if (col.a <= threshold)
    discard;

关于c++ - 避免写入Alpha值为0的深度缓冲区,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34368679/

10-09 06:23