当您说您有不同大小的顶点时,我不确定我是否完全理解您的意思。但是 OpenGL 可以处理 D3D 可以处理的任何顶点格式。
OpenGL 没有的是顶点“流”的概念。那是因为它不需要它们;将每个单独的属性(位置、法线、颜色等)视为一个单独的流。但它们都可以来自同一个缓冲区,并且它们都可以相互交织。
缓冲区对象的工作方式非常简单。缓冲区对象只是由 OpenGL 控制的一块大小的内存。您可以在其中放入您想要的任何字节。
要告诉 OpenGL 如何从中获取顶点数据,您必须定义许多数组,每个数组都与一个属性相关联。用于此的函数是 glVertexPointer、glNormalPointer 等;它们都是 gl*Pointer 的形式。你似乎已经掌握了那么多。
你可能不明白的是,这些函数定义的顶点格式并不是与缓冲区对象永久关联的。例如,您可以使用带有字节颜色的 3D 位置,所有这些都来自同一个缓冲区对象:
glBindBuffer(GL_ARRAY_BUFFER, bufferObject);
glEnableClientState(GL_VERTEX_ARRAY); //Our vertices contain positions.
glVertexPointer(3, GL_FLOAT, 16, (void*)0); //The last parameter is the byte offset from the beginning of the buffer to where the data starts.
glEnableClientState(GL_COLOR_ARRAY); //Our vertices contain colors.
glColorPointer(4, GL_UNSIGNED_BYTE, 16, (void*)12); //Offset must add in the 3 floats from the vertex.
//Draw stuff.
稍后,您可以重新定义此指针,根据需要更改格式。这一次,我们使用 2D 位置,定义为短裤,完全没有颜色:
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(2, GL_SHORT, 4, (void*)1024);
glDisableClientState(GL_COLOR_ARRAY); //Our vertices contain no colors.
//Draw stuff.
这些调用之间的缓冲区绑定未更改。这个新数组从缓冲区的开头开始 1024 个字节。因此,您可以将多个对象的数据放在同一个缓冲区中。
现在,OpenGL ES 1.1 没有提供 D3D 提供的一件事。当您调用 DrawIndexedPrimitives 时,您可以在从数组中获取顶点之前提供一个添加到每个索引的偏移量。Desktop OpenGL 3.2 及更高版本提供此功能(以及通过扩展的较低版本),但不提供 ES 1.1。