使用 glVertexAttribBinding/glVertexArrayAttribBinding 将属性与多个 VBO 关联

问题描述 投票:0回答:1

假设我有 2 个网格,每个网格使用一个 VBO。顶点属性(位置、法线、颜色) 包含在一个结构中:

struct Vertex {
   glm::vec3 position;
   glm::vec3 normal;
   glm::vec3 color;
}

并且它们在 VBO 中交错;类似于此链接中的第三个选项:

另一种方法是在批次中交错每个顶点的顶点属性,然后顺序存储每个交错的顶点块,再次将所有顶点属性组合到单个缓冲区中。和以前一样,您将字节偏移量传递到 VBO 的

glVertexAttribPointer
ptr 参数,但您还可以使用 stride 参数来确保每个顶点属性数组仅访问该属性数组的触摸元素。如图所示,该选项是:(VNCVNCVNCVNC)

然后我使用

glVertexAttribFormat
/
glVertexArrayAttribFormat
正确指定格式(位置为属性 0,正常为属性 1,颜色为属性 2)。使用
glBindVertexBuffer
/
glVertexArrayVertexBuffer
,将第一个 VBO 连接到绑定索引 0,将第二个 VBO 连接到绑定索引 1:

glVertexArrayVertexBuffer(vao, 0, vbo1, 0, sizeof(Vertex));
glVertexArrayVertexBuffer(vao, 1, vbo2, 0, sizeof(Vertex));

对于每个属性,我然后使用

glVertexAttribBinding
/
glVertexArrayAttribBinding
关联两个 VBO:

// Position
glVertexArrayAttribBinding(vao, 0, 0);
glVertexArrayAttribBinding(vao, 0, 1);
// Normal
glVertexArrayAttribBinding(vao, 1, 0);
glVertexArrayAttribBinding(vao, 1, 1);
// Color
glVertexArrayAttribBinding(vao, 2, 0);
glVertexArrayAttribBinding(vao, 2, 1);

两个 VBO 都是数据源并且着色器将从两个 VBO 中读取数据,还是第一个 VBO 会被第二个 VBO 替换?如果可能的话,在这种情况下顶点排序将如何工作(可能从第一个 VBO 排序,然后从第二个 VBO 排序)?我认为这将是实现批量渲染的好方法,我可以为每个网格创建一个 VBO,并在我想要批量渲染多个网格时将 VBO“插入”VAO。

c++ opengl vertex-buffer
1个回答
0
投票

任何形式的“批量渲染”都要求顶点位于同一个缓冲对象中。

至于您的代码的具体情况:

glVertexArrayAttribBinding(vao, 0, 0);
glVertexArrayAttribBinding(vao, 0, 1);

这在功能上等同于:

i = 0;
i = 1;

单个顶点属性来自一个缓冲区对象。多个属性可以共享同一个缓冲区,但一个属性只能源自单个缓冲区对象。使用的缓冲区绑定将是您设置的最后一个(对于该属性,在该 VAO 中),就像

i
采用您设置的最后一个值一样。

© www.soinside.com 2019 - 2024. All rights reserved.