OpenGL - 切换着色器

时间:2016-09-28 18:16:11

标签: opengl opengl-es shader

我试图理解以下内容:

我有一个对象,我希望能够使用两组不同的顶点/片段着色器进行渲染,每个着色器都有它们的制服和纹理,并在这两个设置之间来回切换。 (我知道在这种情况下,我可以只使用一个带有统一的着色器来指示运行哪个逻辑,但这是我无法做到的更大事情的一部分)

  • 我应该使用一个或两个gl程序(由glCreateProgram()创建)吗?
  • 如果我使用两个程序,是否可以丢弃未使用的程序,如果以后需要重建它?还是太慢了?
  • 如果我只使用一个程序:
    • 我可以在开头只编辑一次着色器吗?
    • 切换时我应该分离旧的着色器,添加新的着色器并再次链接程序吗?
    • 我应该在连接后重新计算所有制服位置吗?
    • 我应该在链接后重新绑定数组缓冲区吗?
    • 我应该做些什么来删除以前附加的纹理吗?

1 个答案:

答案 0 :(得分:4)

  

我应该使用一个或两个gl程序(由glCreateProgram()创建)吗?

这取决于具体情况。一般规则可以避免在着色器代码内进行分支。因此,如果您有2个不同的着色器,对于2种不同的效果,只需编译2个程序并绑定所需的着色器。

  

如果我使用两个程序,丢弃未使用的程序可以,   如果以后需要重建它?还是太慢了?

这通常不需要和错误(可能除非您有巨大的内存问题)。着色器编译是一个缓慢的过程。

在应用程序启动时或首次需要时编译所有必需的资源更为常见,并将它们分配并准备好使用。

  

我可以在开头只编译一次着色器吗?

对于所有剩下的问题:我认为你采取了错误的方法。

我会说:

  • 在开头(或需要程序时)编译所有着色器变体
  • 绑定着色器和相关资源,在使用该着色器绘制之前设置制服。
  • 更改着色器时,仅在不同且需要时重新绑定资源或更新统一值
  • 在应用程序结束时发布资源和程序