Opengl 同一顶点缓冲区对象中的多个网格?
我希望在同一VBO中保留多个不同的网格,以便可以使用Opengl 同一顶点缓冲区对象中的多个网格?,opengl,graphics,3d,Opengl,Graphics,3d,我希望在同一VBO中保留多个不同的网格,以便可以使用glDrawerElementsBaseVertex绘制它们。在这样的VBO中,不同网格的顶点规格有多大的不同,才能像这样绘制网格 更具体地说: 不同网格的顶点阵列是否具有不同的布局(交错(VNCVNCVNCVNC)与批处理(VVNNNCCC)) 不同网格的顶点可以具有不同数量的属性吗 对于不同的网格(vec3,vec4,…),相同着色器位置的属性是否可以具有不同的大小 相同着色器位置的属性是否可以针对不同的网格具有不同的类型(GL_FLOAT
glDrawerElementsBaseVertex
绘制它们。在这样的VBO中,不同网格的顶点规格有多大的不同,才能像这样绘制网格
更具体地说:
vec3
,vec4
,…),相同着色器位置的属性是否可以具有不同的大小GL_FLOAT
,GL_HALF_FLOAT
,…)当我说网格时,我指的是一个顶点数组,其中每个顶点都有一些属性(位置、颜色、法线、uv等)。openGL不关心每个缓冲区中有什么,它只关注属性是如何指定的,如果它们恰好使用相同的缓冲区,甚至重叠,那么就可以了。它假设你知道你在做什么
glDraw*BaseVertex
变量除了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,则需要使每个网格的布局相同,否则只需重新绑定属性即可