2013-09-27 25 views
3

要在OpenGL中绘制,您需要指定一个顶点数组,然后使用索引将顶点数组连接在一起,形成基本的语法顺序。你可以用glDrawElements来做到这一点。要指定顶点,您可以使用glVertexPointer,您可以在其中指定一个参数“stride” - 数组中连续元素之间的间隔(即,如果将顶点存储在包含其他数据的结构中,则可以跨越其他数据)。在OpenGL中,你如何指定步伐?

这很好,但现在我使用的是Assimp,它指定了它在一个face结构中的索引。

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中做到这一点?

回答

1

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

顺便说一句:步幅表示元素开始之间的偏移量,而不是元素结束到下一个元素开始之间的偏移量。

0

最好的办法是对网格进行三角网格划分,以便与GL_TRIANGLES(或尽可能考虑交换材料/纹理等)一起绘制整个网格。

如果你真的想要不同大小的多边形,这是可能的。我怀疑它会非常快,我认为你不得不使用GL_TRIANGLE_FAN做三角测量,并不总是给出很好的结果(例如沿任一对角线分割一个四边形)。无论如何,答案:

glPrimitiveRestartIndex可能会工作与glDrawElementsGL_TRIANGLE_FAN确定,但真正三角测量自己是最好的。 (其实很类似于你的“gl ... ElementPointer”的想法),但可能是slower than glPrimitiveRestartIndex

编辑另一种替代方案是glDrawElementsIndirect,但乍一看这可能比glPrimitiveRestartIndex花费更多。