提问者:小点点

OpenGL 4 向顶点缓冲区提供数据


我使用旧方法将数据提供给OpenGL中的顶点缓冲区

glGenBuffers(1, buffer);
glBindBuffer(GL_ARRAY_BUFFER, buffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(pos), pos, GL_STATIC_DRAW);
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, 0);
glEnableVertexAttribArray(1);

从OpenGL 4.3开始,出现了一种新的稍微更清晰的向顶点着色器提供数据的方法

const GLfloat colors[] =
{
    1.0f, 0.0f, 0.0f,
    0.0f, 1.0f, 0.0f,
    0.0f, 0.0f, 1.0f
};
glBindVertexBuffer(1, buffer, 0, 3 * sizeof(GLfloat));

glVertexAttribFormat(1, 3, GL_FLOAT, GL_FALSE, 0);
glVertexAttribBinding(1, 1);
glEnableVertexAttribArray(1);

但我找不到任何资源来解释如何使用新的方式提供数据。我当然可以这样做

glBindBuffer(GL_ARRAY_BUFFER, buffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(colors), colors, GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0); //i can do even so, and later I can use glBindVertexBuffer

但是看起来真的不优雅。如果我不使用glBindBuffer,只使用glBindVertexBuffer,然后使用glBufferData,我将覆盖使用glBindBuffer绑定的缓冲区中的数据。< br >因此,问题是:我可以用其他方式向顶点缓冲区提供数据吗?或者我应该始终使用glBindBuffer、glBufferData,然后才使用glBindVertexBuffer、glVertexBufferFormat、glVertexAttribBinding和glVertexAttribBinding。谢谢大家!


共2个答案

匿名用户

从OpenGL4.3规范中可以看出,您仍然需要将顶点缓冲区绑定到“常规”绑定点,以便更新其数据:

glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferSubData(GL_ARRAY_BUFFER, offset, size, data);

通过引入 DSA 函数,这个问题在 4.5 规范中得到了有效的解决,它允许您更新缓冲区数据而无需先将其绑定到插槽:

glNamedBufferSubData(buffer, offset, size, data);

匿名用户

glVertexAttribFormat和glVertexAttribBinding告诉OpenGL数据是如何在缓冲区中组织的;本质上,它们取代了glVertexAttribPointer(并且只有glVertexATTribPointe)。加载数据仍然使用glBuffer[Sub]data进行。