具有可变索引数的OpenGL glDrawElements

时间:2014-11-04 01:05:12

标签: c++ opengl

我一直在使用glDrawElements来绘制描述对象的三角形。但是,我正在尝试加载我在网上找到的一些OFF对象,我看到它描述了顶点的索引:

...
4 195 209 210 196
4 196 210 211 197
3 197 211 15
3 0 212 198
4 198 212 213 199
4 199 213 214 200
...

我的问题是,如何在3个顶点索引和4个索引(以及任何其他数量的索引)描述的绘图元素之间切换。目前我只能加载使用3个索引来描述顶点的OFF文件:

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IBO);
int size; glGetBufferParameteriv(GL_ELEMENT_ARRAY_BUFFER, GL_BUFFER_SIZE, &size);
glDrawElements(GL_TRIANGLES, size/sizeof(GLushort), GL_UNSIGNED_SHORT, 0);

任何有关教程或任何相关内容的提示或参考/指示都可以帮助我概括一些事情?

2 个答案:

答案 0 :(得分:1)

只要多边形是凸的,就可以很容易地对它们进行三角测量。一种方法是将每个多边形拆分为三角形,然后使用基本类型GL_TRIANGLES进行绘制。对于具有n个顶点的多边形,您将得到由顶点定义的n - 2个三角形,其中包含以下基于0的索引:

0 1 2
0 2 3
0 3 4
...
0 n-2 n-1

对于您的示例,索引序列为:

195 209 210 195 210 196
196 210 211 196 211 197
197 211 15
0 212 198
198 212 213 198 213 199
199 213 214 199 214 200

更优雅的方法是使用基本类型GL_TRIANGLE_FAN绘制每个多边形。三角形扇形的顶点顺序与多边形完全相同,因此您可以按顺序指定索引:

0 1 2 3 ... n-1

要分隔多边形,可以使用基元重启。启用它:

glPrimitiveRestartIndex(0xffff);
glEnable(GL_PRIMITIVE_RESTART);

然后在多边形之间插入重启索引。以你的例子:

195 209 210 196 0xffff
196 210 211 197 0xffff
197 211 15 0xffff
0 212 198 0xffff
198 212 213 199 0xffff
199 213 214 200

答案 1 :(得分:0)

数据集的第一个条目是四边形,可以使用顶点{1,2,3}和{1,3,4}(即{195,209,210}和{195,210,196}分割为2个三角形作为第一个条目)。对数据集中的每个四边形使用相同的方案。如果你得到反转tris,请尝试翻转顶点的顺序(例如{195,210,209}而不是{195,209,210})。