Android 不同混合模式的OpenGL ES性能

Android 不同混合模式的OpenGL ES性能,android,performance,opengl-es,opengl-es-2.0,Android,Performance,Opengl Es,Opengl Es 2.0,我需要在渲染的场景上应用全屏摄影般的渐晕效果。显然,我必须使用混合来实现这一点。我想选择最快的混合模式,因为它将适用于所有屏幕空间 OpenGL ES中的某些混合模式是否比其他模式工作得更快?或者任何混合模式是否在相同的填充率下工作?到目前为止,我还没有在互联网上找到任何资源说某些混合模式比其他混合模式慢或快,所以我决定就此提出这个问题 这是针对Android应用程序的,所以我知道这种行为当然可能取决于GPU供应商,但对于更快的混合,可能有一些共同的考虑因素?混合的一个缓慢部分是从backbuf

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

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


这是针对Android应用程序的,所以我知道这种行为当然可能取决于GPU供应商,但对于更快的混合,可能有一些共同的考虑因素?

混合的一个缓慢部分是从backbuffer读取像素(不关alpha或rgb或两者)。因此,只要使用
dst
color/alpha(即不使用像
glBlendFunc(GL_-ONE,GL_-ZERO)
glBlendFunc(GL_-ZERO,GL_-ONE)
或类似的退化混合函数)进行“真实”混合,就没有性能差异。

选择哪种混合选项都无所谓,它将减慢片段着色器的速度,因为它需要从目标帧缓冲区读回像素值。您可以通过将效果拆分为围绕屏幕边框设置的一些四边形并保留帧缓冲区的中心部分而不覆盖四边形来节省一些周期。您还可以使用一些更复杂的方法来使用一些基于瓷砖的移动GPU(如Mali GPU)所使用的早期碎片丢弃,但可能不值得这么做。

简而言之,不,可能没有更糟糕的blendmode(只要您正在进行“真正的”混合)

混合可以通过使用固定的函数“混合阶段”来实现,也可以通过向着色器程序添加短尾来实现,该着色器程序将执行实际的混合。另一个解决方案是,大多数常见混合模式都使用固定函数,而如果存在不常见的混合模式,则由着色器接管。如果您点击着色器一,您的性能可能会受到影响


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

这对我来说并不明显。根据填充率(100%覆盖率,但也许不超过400%?),我也会考虑将渐晕效应直接放在每个片段着色器上(通过GLY-FraceCORD告诉屏幕上的像素位置)。不幸的是,它不适用,因为有些对象相互混合和透支(它们非常小,所以透支惩罚不明显)。如果在片段着色器中将渐晕应用于这些对象,则将应用两次,这不是一个选项。感谢您提出早期消隐,它在许多情况下确实很有用,但我需要在整个场景中应用渐变色调。虽然@TraxNet的答案也很有用,但它不适用于我的情况。您的答案简单明了地解释了OpenGL混合行为,谢谢。我对你的回答非常满意。是的,我的答案几乎与这个答案相同;)