更新统一值是否会拖延整个渲染管道?

Lex*_*x R 2 opengl opengl-3

glBufferSubData手册页的笔记部分包含以下段落:

考虑使用多个缓冲区对象,以避免在数据存储更新期间停止渲染管道.如果管道中的任何渲染引用glBufferSubData正在更新的缓冲区对象中的数据,特别是来自正在更新的特定区域,则在更新数据存储之前,该渲染必须从管道中消失.

虽然glUniform*manpage根本没有提到管道.
但是,我会认为制服和缓冲区一样重要,因为它们应该在所有着色器调用中都是统一的.
因此,如果我执行绘制调用,更改一个统一值,然后在同一个着色器上执行另一个绘制调用,两个绘制调用将同时运行不同的统一值,或者第二个绘制调用必须等到每个阶段(vert/geom/frag)在第一个完成?

Nic*_*las 5

一般形式的问题几乎无法回答.但考虑一下:

自从GLSL出现以及之前的ARB汇编语言以来,统一/参数状态一直存储在着色器对象中.只有统一块和缓冲区对象才能将统一状态与程序分开.所以在那之前,5年以上,改变制服的唯一方法就是在程序中改变它.

这意味着几乎每个使用GLSL的程序都以标准方式使用它:绑定程序,更换制服,渲染,更改制服,渲染等.

现在,想象一下,如果做这个简单而明显的事情,数百个OpenGL程序确实引起了完整的管道停顿.

司机开发人员并不愚蠢; 即便是英特尔的驱动程序开发人员也不是那么愚蠢.无论他们的硬件是什么样子,他们都可以找到一种方法来进行统一的更改而不会引起管道停滞.