有没有明智的方法在OpenGL ES 2.0上实现深度剥离?

时间:2016-11-28 14:20:04

标签: opengl-es opengl-es-2.0

由于OpenGL ES 2.0缺少GL_ALPHA_TESTglAlphaFunc,因此对透明对象实施深度剥离的常规方法显然不起作用。从理论上讲,我可以在片段着色器中使用if (alpha < 1) discard;,但由于它是一个分支,我担心它可能太慢了。

还有其他方法可以解决这个问题吗?

是否有人对性能if (alpha < 1) discard;有经验,而只是接受从后向前渲染中透支的成本?

编辑:虽然我似乎在上面描述纯alpha测试,但我的目标实际上是实现类似深度剥离或早期z的东西。我正在解决的问题是,使用从前到后的渲染,我会在不透明的像素上获得大量的透支。所以我想渲染两遍。首先是从前到后,使用alpha函数==1打开alpha测试(这是“深度剥离”或“早期z”传递)。第二个是从前到后进行alpha混合和深度测试。

1 个答案:

答案 0 :(得分:3)

一般情况下,不惜一切代价避免大量使用discard。它肯定不是早期zs测试的通用替代品,并且会导致像素之间数据依赖性的一些可怕问题(你无法自信地解析深度值,直到晚期-z因为你不知道提前知道着色器实际上会丢弃一个片段。)

你没有确切地说出你的用例是什么,但是如果它是2D渲染层的不透明精灵那么一个好的解决方法是将每个精灵的几何形状调整为两个批次 - 真正不透明的东西,可以使用深度测试禁用混合(渲染前后),以及在第二遍中绘制的混合内容(在启用深度测试的情况下从前到后渲染,但禁用深度写入)。

此博客概述了该技术:

如果你的内容是经过alpha测试的任意3D内容,那么我担心你会尝试的任何方式都会遇到痛苦,因为丢弃物永远不会那么有效。