打开 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,前面的三角形会遮挡后面的三角形 就好像 它是不透明的,即使它不是不透明的.
我做了两件事来解决这个问题:
- 禁止写入深度缓冲区并根据与相机的距离绘制三角形。
- 使用
glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
解决混合问题。
下面是最终结果
我在 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,前面的三角形会遮挡后面的三角形 就好像 它是不透明的,即使它不是不透明的.
我做了两件事来解决这个问题:
- 禁止写入深度缓冲区并根据与相机的距离绘制三角形。
- 使用
glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
解决混合问题。
下面是最终结果