2

glBufferSubData手册页的注释部分包含以下段落:

考虑使用多个缓冲区对象以避免在数据存储更新期间停止渲染管道。如果管道中的任何渲染引用了由 glBufferSubData 更新的缓冲区对象中的数据,尤其是来自正在更新的特定区域的数据,则该渲染必须从管道中排出,然后才能更新数据存储。

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

4

1 回答 1

5

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

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

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

现在,想象一下,如果做数百个 OpenGL 程序所做的这个简单而明显的事情会导致完整的管道停顿

驱动开发者并不傻;即使是英特尔的驱动程序开发人员也没有那么愚蠢。无论他们的硬件是什么样的,他们都可以找到一种方法来进行统一的更改,而不会导致管道停顿。

于 2012-07-27T20:17:34.360 回答