Jav*_*ave 22 shader android opengl-es opengl-es-2.0
我正在读这篇文章,作者写道:
以下是通过两个简单步骤在每个平台上编写高性能应用程序的方法:
[...]
遵循最佳实践.在Android和OpenGL的情况下,这包括"批量绘制调用","不在片段着色器中使用丢弃"等内容.
我从来没有听说丢弃会对性能等产生不良影响,并且一直在使用它来避免在没有必要时使用详细的alpha时进行混合.
有人可以解释为什么以及何时使用丢弃可能被认为是一种不好的做法,以及discard + depthtest与alpha + blend相比如何?
编辑:在收到关于这个问题的答案后,我做了一些测试,通过渲染背景渐变,顶部有纹理四边形.
if(
gl_FragColor.a < 0.5 ){ discard; }" 行结尾的片段着色器给出了大约32 fps.gma*_*lan 20
"丢弃"对于每种主流图形加速技术都是不利的 - IMR,TBR,TBDR.这是因为片段的可见性(以及因此深度)只能在片段处理之后确定,而不能在Early-Z或PowerVR的HSR(隐藏表面移除)等期间确定.图形管道在移除之前得到的东西往往表明它对性能; 在这种情况下,更多处理片段+破坏其他多边形的深度处理=不良影响
如果必须使用discard,请确保仅使用包含它的着色器渲染需要它的tris,并且为了最小化其对整体渲染性能的影响,按顺序渲染对象:不透明,丢弃,混合.
顺便提一下,只有PowerVR硬件确定延迟步骤中的可见性(因此它是唯一被称为"TBDR"的GPU).其他解决方案可能是基于区块的(TBR),但仍然使用依赖于提交顺序的Early Z技术,如IMR所做的那样.TBR和TBDR在片上进行混合(比去往主存储器更快,耗电更少),因此混合应该有利于透明度.正确渲染混合多边形的常用过程是禁用深度写入(但不测试)并以后向前深度顺序渲染tris(除非混合操作与顺序无关).通常近似排序足够好.几何形状应该避免大面积的完全透明的碎片.通过这种方式,每个像素仍可以处理多个片段,但硬件深度优化不会像丢弃的片段那样中断.
Nic*_*las 18
它依赖于硬件.对于PowerVR硬件和使用基于图块的渲染的其他GPU,使用discard意味着TBR不再假设绘制的每个片段都将成为像素.这个假设很重要,因为它允许TBR评估所有深处第一,那么只有评估的最顶层片段的片段着色.一种延迟渲染方法,硬件除外.
请注意,启用alpha测试会遇到同样的问题.
| 归档时间: |
|
| 查看次数: |
17637 次 |
| 最近记录: |