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

标签 opengl opengl-3

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

Consider using multiple buffer objects to avoid stalling the rendering pipeline during data store updates. If any rendering in the pipeline makes reference to data in the buffer object being updated by glBufferSubData, especially from the specific region being updated, that rendering must drain from the pipeline before the data store can be updated.

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

最佳答案

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

自从GLSL出现,以及之前ARB的汇编语言以来,uniform/parameter state一直都保存在shader对象中。只有统一 block 和缓冲区对象才有可能将统一状态与程序分开。所以直到那时,整整 5 年多,更换制服的唯一方法就是在程序中进行更改。

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

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

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

关于opengl - 更新统一值是否会拖延整个渲染管道?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10314088/

相关文章:

c++ - OpenGL VBO 数据似乎已损坏

java - lwjgl 实体坐标出现问题

opengl - 将 OpenGL ES 帧缓冲区移植到 OpenGL

opengl - Go Lang OpenGL 简单形状 - 空白屏幕

c++ - 通过统一缓冲区对象发送到 GLSL 的数据泄漏到其他绘制调用中 (OpenGL 3.2)

c++ - OpenGL C++ 不会显示纹理

c++ - Windows 7 64 位,Qt 4 : glGetVersion returns "1.1.0", nvogl32v.dll 被卸载

opengl - 渲染 TTF SDL2.0 opengl 3.1

macos - Mac OSX的构建问题

c++ - 无法正确使用 glDrawElements 进行绘制