要在OpenGL中绘图,您可以指定一个顶点数组,然后指定将顶点数组连接在一起形成基本音符的索引。你可以用glDrawElements做到这一点。要指定顶点,可以使用glVertexPointer,在其中可以指定参数“stride” - 数组中连续元素之间的间隙(即,如果将顶点存储在包含其他数据的结构中,则可以跳过其他数据)。
这很好,但现在我使用的是Assimp,它在面结构中指定了它的索引。
struct aiFace {
unsigned int* indices;
unsigned int numIndices;
}
据推测,这是为了支持具有不同大小的面(具有三角形和四边形的网格)的网格。 Assimp很好,可以选择三角测量所有网格,所以我可以保证所有面都是相同的原始。
因此,我真正想要的是能够跨越我的指数,如此:
gl/*...uh...*/ElementPointer(
3,
GL_UNSIGNED_INT,
sizeof(unsigned int) /* skip past the num_indices field*/,
&faces[0]);
但我无法弄清楚如何做到这一点。 glDrawElements假定索引是一个连续的数组。有没有办法在OpenGL中执行此操作?
答案 0 :(得分:3)
抱歉,您不支持OpenGL内置的内容。但是,既然您应该将Assimp加载的数据复制到VBO中,无论是顶点数据还是元素数组,您都可以在该步骤中进行任何必要的重新排列。
BTW:步幅告诉元素开始之间的偏移,而不是元素结束与下一个元素开始之间的偏移。
答案 1 :(得分:1)
您最好的选择是对网格进行三角测量,这样您就可以使用GL_TRIANGLES
一次性绘制整个内容(或者尽可能考虑交换材质/纹理等)。
如果你真的想要不同尺寸的多边形,那么它是可能的。我怀疑它会非常快,我认为你必须使用GL_TRIANGLE_FAN
来进行三角测量,这种测量并不总是能给出很好的结果(比如沿对角线分割四边形)。无论如何,答案是:
glPrimitiveRestartIndex
可能会与glDrawElements
和GL_TRIANGLE_FAN
一起使用,但真正对自己进行三角测量是最好的。
glMultiDrawElements
也是可能的(实际上非常类似于你的“gl ... ElementPointer”的想法)但可能是slower than glPrimitiveRestartIndex。
编辑另一种选择是glDrawElementsIndirect
,但乍一看这可能比glPrimitiveRestartIndex
有更多的开销。