【发布时间】:2016-11-28 14:20:04
【问题描述】:
由于 OpenGL ES 2.0 缺少 GL_ALPHA_TEST 和 glAlphaFunc,因此为透明对象实现深度剥离的常规方法显然不起作用。理论上我可以在片段着色器中使用if (alpha < 1) discard;,但由于它是一个分支,恐怕它可能太慢了。
还有其他方法可以解决这个问题吗?
与仅接受从后到前渲染中过度绘制的成本相比,有人对if (alpha < 1) discard; 的性能有经验吗?
编辑:虽然我似乎在上面描述了纯 alpha 测试,但我的目标实际上是实现类似于深度剥离或 early-z 的东西。我正在解决的问题是,通过从后到前的渲染,我在不透明像素上得到了大量的透支。所以我想分两次渲染。首先是使用 alpha func ==1 从前到后打开 alpha 测试(这是“深度剥离”或“early-z”通过)。第二个是开启了 alpha 混合和深度测试的从后到前。
【问题讨论】:
-
你确定你的意思是深度剥离吗?深度剥离是一种实现与顺序无关的透明度的技术,但您说您已经在进行从后到前的渲染。我想知道你是不是想说 alpha 测试。
-
你是对的。尽管我的目标与深度剥离(或 early-z)非常相似,但我想要 alpha 测试之类的东西。从前到后或从后到前渲染我没有问题,但是从后到前渲染时性能会受到很大影响。在繁重的场景中,我可能会得到平均 8 倍的透支。这些是浪费了数千万像素着色器调用,而其中只有一小部分是半透明的。所以我想在我的第一次通过 alpha 测试时从前到后绘制,以填充深度缓冲区,然后在我的第二次通过时从前到后绘制,这次使用深度测试和 alpha 混合。