opengl - 在 opengl 中更新制服的时间

标签 opengl glsl

对于下面渲染三角形的简单顶点着色器,什么时候从 CPU 更新统一的 mvpMatrix 是安全的(使用 glUniformMatrix4fv)?可以安全地假设在抽奖电话之后,例如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 .这意味着在函数调用返回时,一切(大部分)都“好像”每个命令都已完全执行。因此,您可以根据需要更改制服(或任何其他状态),而不会影响任何先前的渲染命令。

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

关于opengl - 在 opengl 中更新制服的时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70722072/

相关文章:

c++ - OpenGL:如何使用深度排序的顶点数组设计高效的渲染系统?

opengl - GLU NURBS 渲染错误

opengl - GLSL,接口(interface) block

opengl - 从透视变换到正交矩阵

OpenGL/GLSL : What is the best algorithm to render clouds/smoke out of volumetric data?

c++ - opengl 3+缓冲操作

java - 在OpenGL中绘制两个相交的三角形

c++ - 当我在顶点着色器中有 "out"时,OpenGL 不绘制

opengl - Nvidia 显卡上的阴影痤疮

glsl - WebGL:在没有 THREE.JS 帮助的情况下添加镜面光