c++ - 我应该使用相同的 VBO 来传递不同的顶点属性吗?或者我应该使用 2?

标签 c++ opengl attributes shared vbo

我知道 glVertexAttribPointer 将使用调用时绑定(bind)的 VBO 中的值。但是你能在同一个对象上缓冲两次吗?它会取代里面的东西吗?或者你能清除缓冲区吗?不知道这种做法对不对:

glBindVertexArray(VAO);

glBindBuffer(GL_ARRAY_BUFFER, VBO); // shared VBO

glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
glEnableVertexAttribArray(posLoc);
glVertexAttribPointer(posLoc, 3, GL_FLOAT, GL_FALSE, 3*sizeof(GLfloat),(GLvoid*)0);


glBufferData(GL_ARRAY_BUFFER,  sizeof(colours),  colours, GL_STATIC_DRAW);
glEnableVertexAttribArray(colLoc);
glVertexAttribPointer(colLoc, 4, GL_FLOAT, GL_FALSE, 4*sizeof(GLfloat),(GLvoid*)0);

glBindBuffer(GL_ARRAY_VERTEX, 0);
glBindVertexArray(0);

或者如果我应该使用 2 个 VBO 来缓冲数据。如果对同一个绑定(bind)顶点数组对象调用 glBufferData 函数两次,会发生什么情况?这是我想到的另一种方式:

glBindVertexArray(VAO);

glBindBuffer(GL_ARRAY_BUFFER, VBO1); // VBO for vertices

glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
glEnableVertexAttribArray(posLoc);
glVertexAttribPointer(posLoc, 3, GL_FLOAT, GL_FALSE, 3*sizeof(GLfloat),(GLvoid*)0);

glBindBuffer(GL_ARRAY_BUFFER, VBO2); // VBO for colours

glBufferData(GL_ARRAY_BUFFER,  sizeof(colours),  colours, GL_STATIC_DRAW);
glEnableVertexAttribArray(colLoc);
glVertexAttribPointer(colLoc, 4, GL_FLOAT, GL_FALSE, 4*sizeof(GLfloat),(GLvoid*)0);

glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindVertexArray(0);

最佳答案

上面的示例将不起作用,因为第二个 glBufferData 调用将覆盖第二个中的所有缓冲区空间。要正确地做到这一点,您必须正确地使用 stride 和 pointer 参数,以便数据交错。拥有多个 VBO 更容易(并且更干净),每个 VBO 存储一组单独的数据。

关于c++ - 我应该使用相同的 VBO 来传递不同的顶点属性吗?或者我应该使用 2?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30443154/

相关文章:

javascript - 通过 Javascript 动画变换比例

c++ - 具有一些非公共(public)部分的模板函数

动态生成的 Perl Moose 访问器

c++ - float 舍入误差

c++ - 如何制作一个在使用时不会暂停我的程序的菜单?

c++ - glDrawArrays 不绘制

c++ - 我应该在哪里保存我的着色器代码?

javascript - 仅定位带有文本的最后一级元素

C++按值传递数组导致段错误

c++ - 在哪里可以找到一些深入的 DirectX 11 教程?