关于glDrawRangeElements()的问题

Questions about glDrawRangeElements()

本文关键字:问题 glDrawRangeElements 关于      更新时间:2023-10-16

我试图使用glDrawRangeElements()命令渲染一些旧的级别数据。顶点设置正确,索引设置正确,但似乎无法渲染。我终于在网上查了一下,发现了下面的例子:http://www.songho.ca/opengl/gl_vertexarray.html

从这个例子来看,我认为我做错了。显然,开始是一个索引值,结束是一个索引值,而不是索引数组的索引。例如,我假设如果你想渲染10个三角形,那么开始是0,结束是29,计数是30。但我显然错了?

只有当索引值为0,而29实际上是0和29时,这才是正确的。因此,如果索引以400开始,以452结束,则对同一数组的调用将改为

glDrawRangeElements(GL_TRIANGLES, 400, 452, 29, GL_UNSIGNED_BYTE, indices);

正确吗?还有人认为这有点违反直觉吗?关于顶点数组还有什么建议吗?

首先,让我们谈谈glDrawElements,因为Range版本只是对它的修改。count是要从源索引数组中提取并呈现的索引数。每个索引都映射到一个顶点。所以如果你的count是"29",那么你正在尝试渲染29个顶点。如果使用GL_TRIANGLES,这将只呈现27个顶点,因为每个三角形需要三个顶点。OpenGL将丢弃额外的。

所以如果你想要呈现30个索引,你把30作为计数。

现在我们知道如何使用glDrawElements,让我们谈谈glDrawRangeElements。当通常使用glDrawElements时,您在源索引数组中指定要从中提取的位置。indicescount参数告诉OpenGL在哪里找到索引。但是从这个数组中提取的实际索引可以是在源顶点数组索引的边界内的任何地方。

glDrawRangeElements允许你给OpenGL一个范围(包括,因为这是有意义的)顶点索引值。你说的是它在这个draw调用期间得到的索引不会超过那个范围。这可以允许驱动程序执行有用的优化。start的值应该是从索引数组中得到的最低的索引值,而end的值应该是最高的。它应该而不是仅仅是第一个和最后一个顶点的索引。