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

Opengl 同一顶点缓冲区对象中的多个网格?,opengl,graphics,3d,Opengl,Graphics,3d,我希望在同一VBO中保留多个不同的网格,以便可以使用glDrawerElementsBaseVertex绘制它们。在这样的VBO中,不同网格的顶点规格有多大的不同,才能像这样绘制网格 更具体地说: 不同网格的顶点阵列是否具有不同的布局(交错(VNCVNCVNCVNC)与批处理(VVNNNCCC)) 不同网格的顶点可以具有不同数量的属性吗 对于不同的网格(vec3,vec4,…),相同着色器位置的属性是否可以具有不同的大小 相同着色器位置的属性是否可以针对不同的网格具有不同的类型(GL_FLOAT

我希望在同一VBO中保留多个不同的网格,以便可以使用
glDrawerElementsBaseVertex
绘制它们。在这样的VBO中,不同网格的顶点规格有多大的不同,才能像这样绘制网格

更具体地说:

  • 不同网格的顶点阵列是否具有不同的布局(交错(VNCVNCVNCVNC)与批处理(VVNNNCCC))
  • 不同网格的顶点可以具有不同数量的属性吗
  • 对于不同的网格(
    vec3
    vec4
    ,…),相同着色器位置的属性是否可以具有不同的大小
  • 相同着色器位置的属性是否可以针对不同的网格具有不同的类型(
    GL_FLOAT
    GL_HALF_FLOAT
    ,…)
  • 附言。
    当我说网格时,我指的是一个顶点数组,其中每个顶点都有一些属性(位置、颜色、法线、uv等)。

    openGL不关心每个缓冲区中有什么,它只关注属性是如何指定的,如果它们恰好使用相同的缓冲区,甚至重叠,那么就可以了。它假设你知道你在做什么

  • 是的,如果对每个网格使用VAO,则每个网格的布局都存储在VAO中,并且绑定其他网格将正确设置属性。通过这种方式,您可以定义从缓冲区开始的偏移,因此不需要
    glDraw*BaseVertex
    变量

  • 不确定

  • 是的,它们将自动转换为attributePtr调用中定义的正确类型


  • 除了ratchet freak的答案之外,我将仅详细阐述第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分量同质坐标。

    太好了,感谢anwser!需要明确的是:1)glDraw*BaseVertex变体不允许对多个网格使用单个VAO,因此速度更快吗?@Aloalo如果使用VAO,则需要使每个网格的布局相同,否则只需重新绑定属性即可