OpenGL 4 向顶点缓冲区提供数据
OpenGL 4 providing data to vertex buffer
我使用旧方法向 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 绑定的缓冲区中的数据。
所以问题是:我能否以其他方式向顶点缓冲区提供数据,或者我应该始终使用 glBindBuffer、glBufferData,然后才使用 glBindVertexBuffer、glVertexBufferFormat、glVertexAttribFormat 和 glVertexAttribBinding。谢谢!
glVertexAttribFormat 和 glVertexAttribBinding 告诉 OpenGL 如何数据在缓冲区中组织;本质上它们取代了 glVertexAttribPointer(和 only glVertexAttribPointer)。加载数据仍然发生在 glBuffer[Sub]Data.
据我所知,OpenGL 4.3 规范表明,您仍然需要将顶点缓冲区绑定到 "regular" 绑定点以更新其数据:
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferSubData(GL_ARRAY_BUFFER, offset, size, data);
这个问题已经在 4.5 规范中有效地解决了,引入了 DSA 功能,它允许您更新缓冲区数据而无需先将其绑定到插槽:
glNamedBufferSubData(buffer, offset, size, data);
我使用旧方法向 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 绑定的缓冲区中的数据。
所以问题是:我能否以其他方式向顶点缓冲区提供数据,或者我应该始终使用 glBindBuffer、glBufferData,然后才使用 glBindVertexBuffer、glVertexBufferFormat、glVertexAttribFormat 和 glVertexAttribBinding。谢谢!
glVertexAttribFormat 和 glVertexAttribBinding 告诉 OpenGL 如何数据在缓冲区中组织;本质上它们取代了 glVertexAttribPointer(和 only glVertexAttribPointer)。加载数据仍然发生在 glBuffer[Sub]Data.
据我所知,OpenGL 4.3 规范表明,您仍然需要将顶点缓冲区绑定到 "regular" 绑定点以更新其数据:
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferSubData(GL_ARRAY_BUFFER, offset, size, data);
这个问题已经在 4.5 规范中有效地解决了,引入了 DSA 功能,它允许您更新缓冲区数据而无需先将其绑定到插槽:
glNamedBufferSubData(buffer, offset, size, data);