4

要在 OpenGL 中绘图,您需要指定一个顶点数组,然后指定将顶点数组连接在一起的索引,从而形成一个有意义的图元顺序。您可以使用 glDrawElements 做到这一点。要指定顶点,您可以使用 glVertexPointer,您可以在其中指定参数“stride” - 数组中连续元素之间的间隙(即,如果您将顶点存储在包含其他数据的结构中,则跨步跳过其他数据)。

这很好,但现在我使用的是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 中做到这一点?

4

2 回答 2

3

Sorry, there's no support for what you're looking for built into OpenGL. However since you should copy the data as loaded by Assimp into VBO's anyway, both the vertex data and the elements array, you can do any necessary rearrangements in that step.

BTW: the stride tells the offset between start of elements, not offset between end of element to start of next element.

于 2013-09-30T12:39:57.603 回答
1

你最好的办法是对网格进行三角测量,这样你就可以一次画出整个东西GL_TRIANGLES(或者尽可能考虑交换材料/纹理等)。

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

glPrimitiveRestartIndex可能会与glDrawElementsand一起工作GL_TRIANGLE_FAN,但最好对自己进行三角测量。

glMultiDrawElements也是可能的(实际上与您的“gl...ElementPointer”想法非常相似)但可能比 glPrimitiveRestartIndex 慢

编辑另一种选择是glDrawElementsIndirect,但乍一看,这可能比glPrimitiveRestartIndex.

于 2013-09-30T12:53:45.263 回答