glBufferSubData manpage的备注部分包含以下段落:
考虑使用多个缓冲区对象,以避免在数据存储更新期间停止渲染管道。如果管道中的任何渲染引用glBufferSubData正在更新的缓冲区对象中的数据,特别是来自正在更新的特定区域,则在更新数据存储之前,该渲染必须从管道中消失。
虽然glUniform* manpage根本没有提到管道
但是,我认为制服和缓冲区一样重要,因为它们应该在所有着色器调用中都是统一的。
因此,如果我执行绘制调用,更改一个统一值,然后在同一个着色器上执行另一个绘制调用,两个绘制调用将同时运行不同的统一值,或者第二个绘制调用必须等到每个< / em> stage(vert / geom / frag)在第一个完成?
答案 0 :(得分:5)
一般形式的问题几乎无法回答。但请考虑一下:
自GLSL出现以及之前的ARB汇编语言以来,统一/参数状态始终存储在着色器对象中。只有统一块和缓冲区对象才能将统一状态与程序分开。所以在那之前,5年以上,改变制服的唯一方法就是在程序中改变它。
这意味着几乎所有使用GLSL的程序都以标准方式使用它:绑定程序,更换制服,渲染,更改制服,渲染等。
现在,想象一下,如果做这个简单而明显的事情,数百个OpenGL程序确实引起了完整的管道停滞。
驱动程序开发人员并不愚蠢;即便是英特尔的驱动程序开发人员也不是那么愚蠢。无论他们的硬件是什么样子,他们都可以找到一种方法来进行统一的更改,而不会导致管道停滞。