打开 GL Depth 和 Alpha 问题

Open GL Depth and Alpha issues

我在 GL 中渲染两个三角形。每个底部的两个顶点都有一个设置的 alpha 值以使它们透明。我正在使用由以下调用定义的深度测试和 Alpha 混合

glEnable(GL_DEPTH_TEST);
glDepthMask(GL_TRUE);
glDepthFunc(GL_LEQUAL);
glDepthRange(0.0f, 1.0f);
glEnable(GL_SAMPLE_ALPHA_TO_COVERAGE);
glEnable(GL_SAMPLE_ALPHA_TO_ONE);
glEnable(GL_BLEND);
glBlendEquation(GL_FUNC_ADD);
glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_ALPHA_TEST);
glAlphaFunc(GL_GREATER, 0.1f);

这是我得到的结果:

我希望通过第一个三角形的透明像素看到第二个三角形的顶部,但它似乎被深度测试切断了。背景颜色在三角形上也显得更加透明(一些混合问题?)

如何按预期渲染它?

编辑:

如果我禁用写入深度缓冲区并按从后到前的顺序绘制三角形,我会得到以下结果。请注意背景如何在三角形上更加透明,以及第二个三角形尖端的白线。这里有一些明确的混合问题。

禁止写入深度缓冲区:

glDepthMask(GL_FALSE);

然后按back-to-front顺序绘制三角形。

这并不完美,但它是处理透明对象的典型方式,而且非常简单。

如果启用深度写入并绘制 front-to-back,前面的三角形会遮挡后面的三角形 就好像 它是不透明的,即使它不是不透明的.

我做了两件事来解决这个问题:

  1. 禁止写入深度缓冲区并根据与相机的距离绘制三角形。
  2. 使用 glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE_MINUS_SRC_ALPHA); 解决混合问题。

下面是最终结果