在 opengl 中更新制服的时间

timing for update of uniforms in opengl

对于下面渲染三角形的简单顶点着色器,什么时候从 CPU(使用 glUniformMatrix4fv)更新统一 mvpMatrix 是安全的?可以安全地假设在抽奖电话之后,例如glDrawArrays 可以为下一次抽奖更新制服吗?或者是否有同步机制来确保更新不会在应用 MVP 矩阵的顶点着色器中途发生。

#version 330
layout (location=0) in vec3 vert
uniform mat4 mvpMatrix;

void main(void)
{
    gl_Position = mvpMatrix * vec4(vert, 1.0);
}

OpenGL 是 defined as a synchronous API。这意味着在函数调用 returns 时,一切(大部分)都“好像”每个命令都已完全执行。因此,您可以根据需要更改制服(或任何其他状态),而不会影响任何先前的渲染命令。

现在,这并不是一个 的想法。但是一个想法有多糟糕取决于所讨论的状态类型。更改统一状态非常便宜(尤其是与其他状态相比),并且 OpenGL 的实现希望您在渲染调用之间这样做,因此它们针对这种情况进行了优化。更改 storage 的内容(就像存储在用于提供统一数据的缓冲区对象中的数据)将会更加痛苦。因此,如果您使用 UBO,最好将数据写入未使用的缓冲区,而不是覆盖先前渲染命令正在使用的缓冲区部分。