我需要在渲染场景上应用全屏摄影般的晕影效果。显然,我必须使用混合来实现这一点。我想选择最快的混合模式,因为它将应用于所有屏幕空间。
OpenGL ES 中的某些混合模式是否比另一种更快?或者是否有任何混合模式以相同的填充率工作?到目前为止,我还没有在 Internet 上找到任何资源说某些混合模式比另一种慢或快,所以我决定在 SO 上问这个问题。
这是针对 Android 应用程序的,所以我知道这种行为当然可能取决于 GPU 供应商,但也许有一些常见的考虑因素可以加快混合速度?
我需要在渲染场景上应用全屏摄影般的晕影效果。显然,我必须使用混合来实现这一点。我想选择最快的混合模式,因为它将应用于所有屏幕空间。
OpenGL ES 中的某些混合模式是否比另一种更快?或者是否有任何混合模式以相同的填充率工作?到目前为止,我还没有在 Internet 上找到任何资源说某些混合模式比另一种慢或快,所以我决定在 SO 上问这个问题。
这是针对 Android 应用程序的,所以我知道这种行为当然可能取决于 GPU 供应商,但也许有一些常见的考虑因素可以加快混合速度?
混合的一个缓慢部分是从后台缓冲区读取像素(仅 alpha 或 rgb 或两者都无关)。因此,只要它是使用颜色/alpha 的“真实”混合(即不使用类似或类似dst
的退化混合函数) - 就没有性能差异。glBlendFunc(GL_ONE, GL_ZERO)
glBlendFunc(GL_ZERO, GL_ONE)
无论您选择哪种混合选项,它都会减慢片段着色器的速度,因为它需要从目标帧缓冲区读回像素值。您可以通过将效果拆分为围绕屏幕边界设置的一些四边形并保留帧缓冲区的中心部分而不覆盖四边形来节省一些周期。您还可以采取一些更棘手的方法来使用一些基于图块的移动 GPU(如 Mali 的 GPU)所采用的早期片段丢弃,但可能只是不值得付出努力。
简而言之,不,可能没有明显更差的混合模式(只要您正在进行“真正的”混合)。
混合可以通过具有固定功能的混合阶段来实现,也可以通过向将执行实际混合的着色器程序添加一个短尾来实现。另一种解决方案是固定函数用于大多数常见的混合模式,而如果存在不常见的混合模式,则着色器会接管。如果您点击着色器,您的性能可能会受到影响。
知道什么是好是坏将是非常特定于硬件的 - 由于最大的成本是您需要读取和组合两个缓冲区,而不是相对较小的额外着色成本,因此甚至可能无法衡量。