opengl中制服更新的时间

use*_*729 3 opengl glsl

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

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

void main(void)
{
    gl_Position = mvpMatrix * vec4(vert, 1.0);
}
Run Code Online (Sandbox Code Playgroud)

Nic*_*las 6

OpenGL 被定义为同步 API。这意味着一切(很大程度上)都会发生,“就好像”在函数调用返回时每个命令都已完全执行。因此,您可以根据需要更改制服(或任何其他状态),而不会影响任何先前的渲染命令。

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