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