OpenGL ES性能不同的混合模式

时间:2013-02-07 07:37:15

标签: android performance opengl-es opengl-es-2.0

我需要在渲染场景上应用全屏摄影般的晕影效果。显然,我必须使用混合来实现这一目标。我想选择最快的混合模式,因为它将应用于所有屏幕空间。

OpenGL ES中的某些混合模式比另一种更快吗?或者任何混合模式是否以相同的填充率工作?到目前为止,我还没有在互联网上找到任何资源说某些混合模式比另一种更慢或更快,所以我决定在SO上提出这个问题。

这适用于Android应用,所以我理解当然这种行为可能取决于GPU供应商,但是对于更快的混合可能有一些常见的考虑因素?

3 个答案:

答案 0 :(得分:5)

混合的一个缓慢部分是从后备缓冲区读取像素(仅与alpha无关或rgb或两者都无关紧要)。因此,只要使用dst颜色/ alpha进行“真实”混合(即不使用简并混合函数,如glBlendFunc(GL_ONE, GL_ZERO)glBlendFunc(GL_ZERO, GL_ONE)或类似) - 就没有性能差异。

答案 1 :(得分:1)

选择哪个混合选项并不重要,它会减慢片段着色器的速度,因为它需要从目标帧缓冲区读回像素值。您可以通过将效果分割为围绕屏幕边框设置的某些四边形并保留帧缓冲区的中心部分而不覆盖四边形来保存一些周期。你也可以采用一些更棘手的方法来使用一些基于磁贴的移动GPU(如Mali)使用的早期片段丢弃,但也许不值得努力。

答案 2 :(得分:0)

简而言之,没有可能没有一个明显更糟糕的混合模式(只要你做“真正的”混合)。

混合可以通过具有固定的函数混合阶段来实现,也可以通过向将执行实际混合的着色器程序添加短尾来实现。另一种解决方案是固定功能用于大多数常见混合模式,而着色器则在不常见的混合模式下接管。如果你点击着色器,你的表现可能会受到影响。

知道什么是好的或坏的将是特定于硬件的 - 甚至可能是不可测量的,因为最大的成本是你需要读取和组合两个缓冲区,而不是相对较小的额外着色成本。