OpenGL数据传输到显卡

mi7gmzs6  于 2022-11-04  发布在  其他
关注(0)|答案(1)|浏览(217)

当你可以通过uniform将所有数据传输到显卡时,为什么你需要OpenGL中的缓冲区。例如:


# version 330

layout (location = 0) in vec2 pos;

void main()
{
    gl_Position = vec4(pos, 0.0, 1.0);
}

为什么需要上面的代码,当你可以只有以下:


# version 330

uniform vec2 pos;

void main()
{
    gl_Position = vec4(pos, 0.0, 1.0);
}

我真的看不出 VAO ,vbo,ebo等的用途。

w1jd8yoj

w1jd8yoj1#

让我们暂时忘记制服是“制服”的事实:它们的值在绘图调用中不会更改(因此您所要求的内容是不可能的)。
这种类型的统一变量是通过调用某种形式的glUniform来设置的。因此,为了使它“工作”,你必须为你想在整个场景中渲染的每个顶点调用glUniform一次。这个数字对于整个场景来说可能是 * 百万 。因此,每一帧渲染,你都需要调用glUniform数百万次。
如果一个顶点有法线、颜色、纹理坐标或以上的任意组合(或其他),那么你需要为每个值调用一个glUniform函数。
如果你在一个场景中有1亿个顶点,每个顶点有6个属性,那就是6亿次调用这个函数。
每一帧 *。这不是一个性能秘诀。
如果GPU可以查看自己的数据存储空间,不是会更快吗?而不是让CPU单独管理每个数据量?如果你想在多个地方渲染同一个模型,这将是特别正确的。按照你的方式,每次你绘制模型时,你都必须再次调用所有的glUniform。如果GPU只拥有数据,你可以说“在这里用这些参数渲染模型”。

相关问题