同一个顶点缓冲区对象中有多个网格?

时间:2014-09-02 09:47:12

标签: opengl graphics 3d

我想在同一个VBO中保留多个不同的网格,因此我可以使用glDrawElementsBaseVertex绘制它们。不同网格的顶点规范在这样的VBO中有多大不同,以便能够像这样绘制它们?

更具体一点:

  1. 不同网格的顶点数组是否有不同的布局(交错(VNCVNCVNCVNC)与批处理(VVVVNNNNCCCC))?
  2. 不同网格的顶点可以有不同数量的属性吗?
  3. 相同着色器位置的属性是否可以针对不同的网格物体使用不同的尺寸(vec3vec4,...)?
  4. 相同着色器位置的属性可以针对不同的网格物体使用不同的类型(GL_FLOATGL_HALF_FLOAT,...)?
  5. P.S。 当我说网格我指的是一个顶点数组,其中每个顶点都有一些属性(位置,颜色,法线,紫外线......)。

2 个答案:

答案 0 :(得分:1)

openGL并不关心每个缓冲区中的内容,它所看到的只是如何指定属性,以及它们是否碰巧使用相同的缓冲区,甚至是重叠然后很好。它假设你知道你在做什么。

  1. 是的,如果您为每个网格使用VAO,则每个网格的布局都存储在VAO中,绑定另一个网格将正确设置属性。通过这种方式,您可以定义缓冲区起点的偏移量,因此您不需要glDraw*BaseVertex变体

  2. 不确定

  3. 是的,它们会自动转换为attributePtr调用中定义的正确类型。

答案 1 :(得分:1)

除了棘轮怪物的答案之外,我只会详细说明第3点:

是的,你可以这样做。如果设置属性指针以指定比着色器使用的元素更多的元素,则永远不会使用其他值。

如果你反过来这样做并且在着色器中读取的元素数多于数组中指定的元素,则缺少 元素被自动扩展以构建形式为(0,0,0,1)的向量,因此第四个组件将是隐含的1而所有其他(未指定的)将为0.这使得可以将向量直接用作同构坐标或许多情况下的RGBA颜色。

在许多着色器中,人们会看到像

这样的东西
in vec3 pos;
...
gl_Position = matrix * vec4(pos, 1.0);

这实际上没有必要,可以直接使用:

in vec4 pos;
...
gl_Position = matrix * pos;

同时仍在属性数组中仅存储3个分量向量。作为一个副作用,现在有一个着色器也可以处理完整的4分量同质坐标。