在OpenGL中,如何指定具有步幅的索引?

时间:2013-09-27 18:40:52

标签: c++ c opengl

要在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中执行此操作?

2 个答案:

答案 0 :(得分:3)

抱歉,您不支持OpenGL内置的内容。但是,既然您应该将Assimp加载的数据复制到VBO中,无论是顶点数据还是元素数组,您都可以在该步骤中进行任何必要的重新排列。

BTW:步幅告诉元素开始之间的偏移,而不是元素结束与下一个元素开始之间的偏移。

答案 1 :(得分:1)

您最好的选择是对网格进行三角测量,这样您就可以使用GL_TRIANGLES一次性绘制整个内容(或者尽可能考虑交换材质/纹理等)。

如果你真的想要不同尺寸的多边形,那么它是可能的。我怀疑它会非常快,我认为你必须使用GL_TRIANGLE_FAN来进行三角测量,这种测量并不总是能给出很好的结果(比如沿对角线分割四边形)。无论如何,答案是:

glPrimitiveRestartIndex可能会与glDrawElementsGL_TRIANGLE_FAN一起使用,但真正对自己进行三角测量是最好的。

glMultiDrawElements也是可能的(实际上非​​常类似于你的“gl ... ElementPointer”的想法)但可能是slower than glPrimitiveRestartIndex

编辑另一种选择是glDrawElementsIndirect,但乍一看这可能比glPrimitiveRestartIndex有更多的开销。