我想要想出一种粗略的方法来“基准”我对片段着色器所做的调整的性能改进(具体来说,我想测试在片段着色器中使用pow去除伽马计算的性能影响)。
所以我想,如果一个框架用1ms来用我的着色器渲染一个不透明的立方体模型,如果我设置glDisable(GL_DEPTH_TEST)并循环我的呈现调用100次,那么这个框架就需要100 1ms来渲染。
我错了。将其渲染100次只会导致大约10倍的减速。显然,如果仍然启用深度测试,那么第二次和后续抽签调用中的大部分片段(如果不是全部的话)将不会被计算出来,因为它们都会失败深度测试。
然而,即使在深度测试结束后,我仍然会经历很多片段的筛选。
我的问题是,我的硬件(在这种特殊情况下,我正在体验的是一个在iOS6.1上的iPad3 --一个PowerVR SGX543MP4)是否非常聪明,是否能够使用稍后绘制调用的几何图形来封存和丢弃早期几何图形中的碎片。如果这不是正在发生的事情,那么我无法解释我所看到的比预期更好的表现。不过,这个问题也适用于所有类型的OpenGL和桌面GPU。
编辑:我认为“绕过”这种优化的简单方法可能是glEnable(GL_BLEND)之类的。我试试看,然后汇报。
发布于 2013-12-30 20:55:44
PowerVR硬件是基于基于瓷砖的延迟渲染的。直到在之后,它才开始绘制片段,它接收到屏幕上瓷砖的所有几何信息。这是一种比z缓冲更先进的隐藏表面去除技术,你在这里发现的是,启用alpha混合破坏了硬件利用这一点的能力。
阿尔法混合是非常顺序依赖的,因此不再可以推迟栅格化和阴影的点,只有顶部的几何图形在一个瓷砖必须绘制。如果没有alpha混合,由于不依赖于绘制事物的顺序,所以在发生昂贵的每个片段操作之前,可以跳过完全模糊的几何图形。只有当您开始混合片段时,才会出现真正的顺序依赖的情况,并且完全破坏硬件对隐藏表面的延迟/裁剪处理的能力。
老实说,如果您想优化一个基于PowerVR硬件的平台,那么您可能应该将此作为您的目标之一。我的意思是,在优化着色器之前,首先要考虑的是,您是在按顺序绘制东西,还是使用有损PowerVR硬件能力的状态绘制。正如您刚才所发现的,在PowerVR硬件上混合比其他硬件要贵得多.操作本身并不复杂,它只是阻止PVR硬件按其设计的特殊方式工作。
发布于 2013-12-30 05:53:41
只有在添加了这两行之后,我才能确认:
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);帧渲染时间是否以线性方式增加,以响应重复的抽签调用。现在回到我的粗劣基准。
https://stackoverflow.com/questions/20834049
复制相似问题