我正在尝试使用glDrawRangeElements()命令渲染一些旧的关卡数据。我的顶点设置正确,我的索引设置正确,但我似乎无法渲染它。我终于在网上查了一下,看到了这里的例子:http://www.songho.ca/opengl/gl_vertexarray.html
从这个例子来看,我认为我做错了。显然,start是索引值,结尾是索引值,而不是indices数组的索引。我假设,例如,如果你想渲染10个三角形,开始将是0,结尾将是29,计数将是30.但我显然是错的?
只有在0和29的索引值实际上是0和29时才会正确。因此,如果索引以400开始并以452结束,则对该相同数组的调用将改为
glDrawRangeElements(GL_TRIANGLES, 400, 452, 29, GL_UNSIGNED_BYTE, indices);
这是对的吗?有没有人认为这有点反直觉?有关顶点数组的任何其他建议吗?
答案 0 :(得分:20)
首先,我们来谈谈glDrawElements
,因为Range版本只是对它的修改。 count
是从源索引数组中提取的索引数。每个索引都将地图拉到顶点。因此,如果count
为“29”,那么您将尝试渲染29个顶点。如果使用GL_TRIANGLES
,这将只渲染27个顶点,因为每个三角形需要三个顶点。 OpenGL将丢弃额外内容。
因此,如果要渲染30个索引,则将30个作为计数。
现在我们知道了如何使用glDrawElements
,让我们来谈谈glDrawRangeElements
。通常使用glDrawElements
时,您可以在源索引数组中指定要从中拉出的位置。 indices
和count
参数告诉OpenGL在哪里找到索引。但是从这个数组拉出的实际索引可能是在位于源顶点数组索引的边界内。
glDrawRangeElements
允许您为OpenGL提供顶点索引值的范围(包括,因为这是有意义的)。你所说的是在抽奖期间得到的指数不会超过这个范围。这可以允许驱动程序执行有用的优化。 start
值应该是从索引数组中获取的最低索引值,end
应该是最高的。 不应该只是第一个和最后一个顶点的索引。