Opengl es 在OpenGL ES 2.0上实现深度剥离是否有一种合理的方法?

Opengl es 在OpenGL ES 2.0上实现深度剥离是否有一种合理的方法?,opengl-es,opengl-es-2.0,Opengl Es,Opengl Es 2.0,由于OpenGL ES 2.0缺少GL_ALPHA_TEST和glAlphaFunc,因此对透明对象执行深度剥离的常规方法显然不起作用。理论上,如果(alpha

由于OpenGL ES 2.0缺少
GL_ALPHA_TEST
glAlphaFunc
,因此对透明对象执行深度剥离的常规方法显然不起作用。理论上,如果(alpha<1)丢弃,我可以使用
在我的片段着色器中,但由于它是一个分支,我担心它可能太慢了

还有其他的方法吗

如果(alpha<1)丢弃,是否有人具有性能
if的经验与只接受从后到前渲染的透支成本相比


编辑:虽然我在上面描述了纯阿尔法测试,但我的目标实际上是实现类似深度剥离或早期z的功能。我要解决的问题是,通过背对背的渲染,我在不透明像素上得到了大量的过度渲染。所以我想在两个过程中进行渲染。首先是从前到后的alpha测试,alpha func
==1(这是“深度剥离”或“早期z”过程)。第二种是背对背,启用alpha混合和深度测试

通常避免不惜一切代价大量使用
丢弃
。它肯定不是早期zs测试的通用替代品,并且会导致像素之间的数据依赖性出现一些可怕的问题(直到z后期,您才能放心地解析深度值,因为您无法提前知道着色器是否真的会丢弃片段)

你不能确切地说你的用例是什么,但是如果是不透明精灵的2D渲染层,那么一个好的修复方法是将每个精灵的几何体调整为两个批次-真正不透明的东西,可以使用禁用混合的深度测试(从前到后渲染),以及在第二次过程中绘制的混合的东西(在启用深度测试但禁用深度写入的情况下从后向前渲染)

这篇博客很好地概括了这项技术:


如果您的内容是经过alpha测试的任意3D内容,那么我担心无论您尝试哪种方式,您都会感到痛苦,因为丢弃的内容从来没有那么有效。

您确定您的意思是深度剥离吗?深度剥离是一种实现顺序无关透明度的技术,但您说您已经在进行从后到前的渲染。我如果你想说alpha测试的话。你是对的。我想要alpha测试之类的东西,尽管我的目标与深度剥离(或早期z)非常相似。我在前后或前后渲染方面没有问题,但前后渲染会严重影响性能。在重场景中,我可能会获得平均8倍的透支。这些都是浪费了数千万像素着色器调用,而只有一小部分是半透明的。因此,我想在第一次使用时前后绘制alpha测试,填充深度缓冲区,然后在第二次通过时向后拉,这一次使用深度测试和alpha混合。我的案例确实是2D,在不透明部分使用几何体是我正在考虑的替代方案,但它比链接中的示例复杂得多。内容虽然2D不是精灵,但复杂的2D网格是的…所以我猜它可能符合任意3D内容的条件。生成“早期z”这些网格的几何体将是非常困难的。手动绘制也需要很多努力。我想我将测试丢弃路径,如果结果不令人满意,尝试找出如何处理不透明几何体。是的,对于没有某种预处理手段的任意网格,该技术不容易工作-我从未尝试过d在平台上实时预处理纹理。一句话或警告是,
discard
对性能的影响在GPU供应商和硬件版本中可能有些不稳定,因此您可能希望在两台设备上试用。因此我做了一些实验,而对于我的情况,
discard
确实提供了一个小的性能增益n、 这还不够。我将使用自定义几何体来确定深度testing@solidpixel关于
剪辑
?用户可控制的剪辑窗格在ES 2.0中不存在。