是否有一种明智的方法可以在OpenGL ES 2.0上实现深度剥离



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

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

与仅接受透支的成本相比,是否有人有 if (alpha < 1) discard;的经验?

编辑:尽管我看来我描述了上面的纯alpha测试,但我的目标实际上是要实现类似于深度剥离或早期-Z的目标。我要解决的问题是,通过重新渲染,我在不透明的像素上得到了大量的透支。所以我想在两次传球中渲染。首先是前到后返回的,使用Alpha Func ==1打开了Alpha测试(这是"深度启动"或"早期-Z"通行证)。第二,Alpha的混合和深度测试打开,第二次是前面的。

通常不惜一切代价避免大量使用discard。这绝对不是早期Z测试的通用替代品,并且会导致像素之间的数据依赖关系引起一些可怕的问题(您直到lat th late-Z都无法自信地解决深度价值,因为您不提前知道着色器实际上会丢弃片段)。

您不会确切说出什么是用例,但是如果它是不透明精灵的2D渲染层混合残疾人(渲染前后),并在第二次通过中绘制的内容(启用了深度测试,但深度为禁用)。

)。

此博客是该技术的一个很好的概述:

  • https://community.arm.com/groups/arm-mali-graphics/blog/2015/11/19/mali-performance-7-accelerating-2d-rendering-using-using-using-opengl-es

如果您的内容是经过alpha测试的任意3D内容,那么我担心您会遇到痛苦,随着您尝试的方式,因为丢弃从来都不是那么有效。

最新更新