在不同的VBO中存储不同的顶点属性

Arm*_*yan 8 c++ opengl vbo

是否可以在不同的顶点缓冲区中存储不同的顶点属性?

到目前为止我见过的所有例子都是这样的

float data[] = 
{
//position
   v1x, v1y, v1z,
   v2x, v2y, v2z,
   ...
   vnx, vny, vnz,

//color
   c1r, c1g, c1b,
   c2r, c2g, c2b,
   ...
   cnr, cng, cnb,   
};
GLuint buffname;
glGenBuffers(1, &buffname);
glBindBuffer(GL_ARRAY_BUFFER, buffname);
glBufferData(GL_ARRAY_BUFFER, sizeof(data), data, GL_STATIC_DRAW);
Run Code Online (Sandbox Code Playgroud)

并且绘图完成如下:

glBindBuffer(GL_ARRAY_BUFFER, buffname);
glEnableVertexAttrib(position_location);
glEnableVertexAttrib(color_location);
glVertexAttribPointer(position_location, 3, GL_FLOAT, GL_FALSE, 0, 0);
glVertexAttribPointer(color_location, 3, GL_FLOAT, GL_FALSE, 0, (void*)(3*n));

glDrawArrays(GL_TRIANGLES, 0, n/3);

glDisableVertexAttrib(position_location);
glDisableVertexAttrib(color_location);
glBindBuffer(GL_ARRAY_BUFFER, 0);
Run Code Online (Sandbox Code Playgroud)

是否有可能将位置数据和颜色数据存储在不同的VBO中?问题是我不明白这会如何解决,因为你不能同时绑定两个缓冲区,对吗?

如果有一个简单但效率低下的解决方案,我宁愿选择更复杂但更有效的解决方案,因为我处于初级学习状态,而且我不想太复杂化.

另外,如果我问的是可能的,这是一个好主意吗?

澄清:我确实理解如何在不同的VBO中存储不同的属性.我不明白我以后会如何画它们.

Nic*_*las 10

属性位置X与提供该属性的缓冲区对象之间的关联是使用该glVertexAttribPointer命令进行的.它的工作方式很简单,但不直观.

当时glVertexAttribPointer被调用(这是很多人没有得到的部分),当前绑定的任何缓冲区对象都GL_ARRAY_BUFFER与属性X相关联,其中X是第一个参数glVertexAttribPointer.

因此,如果您想拥有一个来自一个缓冲区的属性和一个来自另一个缓冲区的属性,那么您可以这样做:

glEnableVertexAttrib(position_location);
glEnableVertexAttrib(color_location);
glBindBuffer(GL_ARRAY_BUFFER, buffPosition);
glVertexAttribPointer(position_location, 3, GL_FLOAT, GL_FALSE, 0, 0);
glBindBuffer(GL_ARRAY_BUFFER, buffColor);
glVertexAttribPointer(color_location, 3, GL_FLOAT, GL_FALSE, 0, 0);
Run Code Online (Sandbox Code Playgroud)

至于你是否应该将属性分成不同的缓冲区...我会说你应该只在你有明显的需求时才这样做.

例如,假设你正在做一个动态的高度图,也许是为了某种水效果.每个元素的Z位置都会发生变化,但这也意味着法线会发生变化.但是,XY位置和纹理坐标不会改变.

高效的流通常需要双缓冲缓冲区对象或使它们无效(使用glBufferData(NULL)或glMapBufferRange(GL_INVALIDATE_BIT)重新分配它们).这两种方式只有在流数据位于非流数据的另一个缓冲区对象中时才有效.

另一个可证明需求的例子是,如果存储器是一个问题,并且几个对象共享某些属性列表.对象可能具有不同的位置和正常数组,但颜色和纹理坐标数组相同.或类似的东西.

但除此之外,最好只将对象的所有内容放入一个缓冲区中.即使你没有插入数组.

  • 非常感谢!我明白!很多其他事情突然变得清晰了 :))) 我的第二个问题呢?它通常被认为是一个好主意吗? (2认同)