OpenGL(ES):实现可以优化因重绘而产生的碎片吗?

时间:2013-12-30 05:47:46

标签: opengl-es

我想想出一个粗略的方法来“基准”我对片段着色器进行调整的性能改进(具体来说,我想测试去除伽玛计算的性能影响)使用片段着色器中的pow生成的颜色。

所以我认为如果一个帧花了1ms来使用我的着色器渲染一个不透明的立方体模型,如果我设置glDisable(GL_DEPTH_TEST)并循环我的渲染调用100次,那么帧将需要100ms来渲染。

我错了。渲染100次只会导致大约10倍的减速。显然,如果仍然启用深度测试,则不会计算第二次和后续绘制调用中的大多数(如果不是全部)片段,因为它们都将无法进行深度测试。

然而,即使深度测试关闭,我仍然必须经历大量碎片剔除。

我的问题是关于我的硬件(在这种特殊情况下它是iOS6.1上的iPad3,我正在体验这一点 - 一个PowerVR SGX543MP4)只是非常聪明,实际上能够使用以后的几何绘制调用以遮挡并丢弃早期几何体中的片段。如果这不是正在发生的事情,那么我无法解释我所看到的好于预期的表现。不过,这个问题也适用于所有类型的OpenGL和桌面GPU。

编辑:我认为“绕过”此优化的简单方法可能是glEnable(GL_BLEND)或类似的东西。我会尝试这个并报告回来。

2 个答案:

答案 0 :(得分:2)

PowerVR硬件基于tile-based deferred rendering。在 之后,它不会开始绘制片段,它会在屏幕上显示图块的所有几何信息。这是一种比z缓冲更先进的隐藏表面删除技术,你在这里实际发现的是,启用alpha混合会破坏硬件利用它的能力。

Alpha混合非常依赖于顺序,因此不再可以将光栅化和着色延迟到只需要绘制图块中最顶部几何体的点。如果没有alpha混合,由于没有数据依赖于绘制内容的顺序,因此可以在昂贵的每片段操作发生之前跳过完全模糊的几何体。只有当你开始混合碎片时,才会出现真正依赖于顺序的情况,并且完全破坏硬件推迟/剔除隐藏曲面的片段处理的能力。

老实说,如果您正在尝试针对基于PowerVR硬件的平台进行优化,那么您应该将此作为目标之一。我的意思是,在优化着色器之前,首先要考虑是否按顺序绘制内容和/或使用损害PowerVR硬件执行TBDR功能的状态。正如您刚刚发现的那样,在PowerVR硬件上混合比其他硬件昂贵得多......操作本身并不复杂,它只是阻止PVR硬件以其设计的特殊方式工作。

答案 1 :(得分:0)

我只能在添加两行后确认:

glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
为了响应重复的绘制调用,

帧渲染时间以线性方式增加。现在回到我粗略的基准测试。