经常在两个着色器之间交换的OpenGL性能开销

时间:2013-04-19 03:18:37

标签: opengl optimization glsl shader

我遇到两种特殊着色器的情况:

第一个着色器从场景中的所有对象投射阴影,并渲染为单个全屏8位阴影纹理。 glsl代码很短。

第二个着色器在g-buffer上执行延迟光照计算,并渲染到单个全屏32位纹理缓冲区。它使用几种全屏纹理(32位位置,16位正常,32位漫反射,8位镜面,8位阴影)。 glsl代码也很冗长。

如您所见,对于每个灯光,这两个着色器必须随后执行。 A然后是B,A然后是B,A然后是B.这导致了大量的交换。

我已经读过着色器交换有一些相对较高的开销,但我不熟悉GPU如何处理仅两个着色器之间的交换。

这两个着色器程序是否会有效地缓存,这应该不是问题?

我应该组合两个着色器并使用glDrawBuffers()指示输出吗?如果我将它们组合起来,从前一个g-buffer光照阶段加载的5个纹理将在下一个阴影投射阶段保持陈旧状态,这是否会导致任何性能开销?

1 个答案:

答案 0 :(得分:3)

  

这两个着色器程序是否会有效地缓存,这应该不是问题?

问题不在于缓存,但更改着色器会刷新GPU执行管道。管道和分支预测器需要几十个时钟周期才能满足新切换到着色器的需要。

  

我应该组合两个着色器并使用glDrawBuffers()来指示输出吗?

在延迟着色器设置中,如果你可以做到没有太多问题? 当然!