OpenGL-开关着色器

g

我正在努力解决以下问题:

我有一个对象,希望能够使用两组不同的顶点/片段着色器进行渲染,每组着色器均具有其均匀性和纹理,并可以在这两种设置之间来回移动。(我知道在这种情况下,我可能只有一个着色器,并且统一规定要运行哪个逻辑,但这是我无法做到的较大事情的一部分)

  • 我应该使用一两个gl程序(由创建glCreateProgram())?
  • 如果我使用两个程序,可以丢弃一个未被使用的程序,然后在以后需要时对其进行重建吗?还是太慢了?
  • 如果我只使用一个程序:
    • 一开始可以只编译一次着色器吗?
    • 切换时,我应该分离旧的着色器,附加新的着色器,然后再次链接程序吗?
    • 链接后应该重新计算所有制服的位置吗?
    • 链接后应该重新绑定数组缓冲区吗?
    • 我应该做些什么来去除以前附着的纹理?
海森堡

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

这要视情况而定。一般规则是避免在着色器代码内部分支。因此,如果您有2个不同的着色器,则要获得2种不同的效果,只需编译2个程序并绑定所需的程序即可。

如果我使用两个程序,可以丢弃一个未被使用的程序,然后在以后需要时对其进行重建吗?还是太慢了?

通常不需要这样做,这是错误的(也许除非您有大量内存问题)。着色器编译是一个缓慢的过程。

在应用程序启动或第一次需要时,一次编译所有必需的资源,然后分配它们并准备使用,这种情况更为常见。

一开始可以只编译一次着色器吗?

是。

对于所有其他问题:我认为您采用了错误的方法。

我会说:

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章