【问题标题】:Will updating a uniform value stall the whole rendering pipeline?更新一个统一的值会使整个渲染管道停止吗?
【发布时间】:2012-04-25 10:47:16
【问题描述】:

glBufferSubData manpage 的注释部分包含以下段落:

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

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

【问题讨论】:

  • 我只是在猜测,但它和其他缓冲区一样(我认为),所以很明显它将以这种方式锁定,因为它是要呈现的状态的一部分。 Nicol 可能对此了解得更多,因为这听起来有点像司机的决心。

标签: opengl opengl-3


【解决方案1】:

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-01
    相关资源
    最近更新 更多