当我尝试渲染透明对象时遇到问题。我只有一个网格,所以只有一个绘制调用,如果对象有点复杂,比如植物,我可以透过对象看到,你可以看到我们可以看到大对象顶部的叶子,但它们通常在后面。
我的绘图功能代码:
glDepthFunc(GL_LESS);
glEnable(GL_CULL_FACE);
glFrontFace(GL_CCW);
glEnable(GL_DEPTH_TEST);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glDepthMask(GL_FALSE);
glBindVertexArray(subMesh.VAO);
glDrawElements(GL_TRIANGLES, subMesh.index_count, GL_UNSIGNED_SHORT, 0);
有人知道问题出在哪里吗? 我的引擎支持固定管道和着色器,我希望有一个适用于这两种技术的解决方案。
当 glDepthMask 设置为 GL_TRUE 时
这就是我想要的效果图
看起来在Unity中,当渲染模式设置为Fade和Transparent时,也有同样的问题,但当我将其设置为Cutout时,没有问题。也许制作一个剪切系统是解决方案?
我尝试缩放对象,减少远平面,所以我不认为这是深度精度问题。
我也尝试使用
glDepthFunc(GL_LEQUAL);
。
首先,目标是渲染特定类型的透明对象:其中各部分“完全透明”或“完全不透明”。在 Unity 中,可以使用 Transparent Cutout Shader 来渲染此类对象。 为了实现这一点,应启用深度测试,包括写入深度缓冲区。因此,请使用
glDepthMask(GL_TRUE)
(默认设置)。
从问题的截图中,我们现在可以看到问题是黑色部分应该是完全透明的。有两种方法可以解决这个问题:重新设计对象,使几何形状与不透明部分完全匹配。
保留
alpha 值大于 0.5 的片段并丢弃其他片段。
glAlphaFunc(GL_GREATER, 0.5);
glEnable(GL_ALPHA_TEST);
if (texel.a <= 0.5) // Note: the documentation uses <, which is not exactly equivalent.
discard;
)。这在计算上是昂贵的,并且可能不会产生 100% 正确的结果。其他更准确的方法存在于顺序独立透明度领域。