2013-02-07 30 views
2

我需要在渲染的场景上应用全屏幕照片般的小插曲效果。显然,我必须使用混合来实现这一点。我想选择最快的混合模式,因为它将应用于所有屏幕空间。不同混合模式的OpenGL ES性能

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

这是针对Android应用程序的,所以我明白当然这种行为可能取决于GPU供应商,但也许有一些共同考虑可以加快混合?

+1

这对我来说并不那么明显。根据填充率(100%覆盖率,但可能不会超过400%?),我还会考虑将渐晕效果直接放在每个片段着色器上(通过gl_FragCoord告诉屏幕上的像素位置)。 –

+0

@AkiSuihkonen是的,我也在考虑这个选项。不幸的是,这是不适用的,因为有一些对象相互混合和透支(它们非常小,所以透支罚款是不明显的)。如果渐变应用于片段着色器中的这些对象,它将被应用两次,这不是一个选项。 – keaukraine

回答

5

混合的单一缓慢部分是从后缓冲器读取像素(不管是仅alpha还是rgb或两者)。因此,只要使用dst颜色/ alpha(即不使用glBlendFunc(GL_ONE, GL_ZERO)glBlendFunc(GL_ZERO, GL_ONE)或类似的简并混合函数)混合使用dst即可“真实” - 没有性能差异。

+0

虽然@ TraxNet的答案也很有用,但它不适用于我的情况。你的答案提供了简单和干净的OpenGL混合行为的解释,谢谢。我完全满意你的答案。 – keaukraine

+0

是的,我的是几乎是这个的重复;) – Trax

1

您选择的混合选项无关紧要,因为它需要从目标帧缓冲区中读回像素值,所以会降低片段着色器的速度。你可以通过将你的效果分成几个四边形来保存一些周期,这些四边形是围绕屏幕边界设置的,并且在没有重叠四边形的情况下离开帧缓冲区的中心部分。你也可以做一些更棘手的方法来使用像马里那样的基于瓦片的移动GPU所使用的早期片段丢弃,但也许是不值得的。

+1

谢谢你提出尽早剔除,它在很多情况下确实很有用,但我需要在整个场景中应用渐变色调。 – keaukraine

0

简而言之,没有可能没有明显差的混合模式(只要你在做“真正的”混合)。

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

知道什么是好还是坏的将是非常HW具体的 - 甚至可能不是衡量由于最大的成本是,你需要阅读,并结合两个缓冲区,而不是相对较小的额外成本的阴影。