glDrawRangeElements不会绘制所选范围

时间:2016-09-15 13:09:27

标签: c++ opengl vbo

我想画两个立方体,它们之间有一个矩形,所以我将顶点数据存储到vbo中,然后我创建了一个ebo(元素缓冲对象)以避免额外的顶点(42对12)。 我需要单独绘制它们,因为我希望矩形反映向上立方体,进行模板测试并在绘制矩形时禁用深度蒙版。 我以为我可以用glDrawElements调用来绘制第一个多维数据集

glDrawElements(GL_TRIANGLES, 36, GL_UNSIGNED_INT, 0);

然后,绘制ractangle我尝试使用glDrawRangeElements

glDrawRangeElements(GL_TRIANGLES, 36, 41, 6, GL_UNSIGNED_INT, 0);

但它只是绘制了多维数据集的基础。

对于最后一个立方体,我使用与第一个立方体相同的绘制调用,只是在z轴上反转它。

我认为我对glDrawRangeElements参数做了一些错误,因为我只尝试对第一个立方体进行一次调用,然后是矩形

glDrawElements(GL_TRIANGLES, 42, GL_UNSIGNED_INT, 0);

它有效。

glDrawRangeElements调用有什么问题?

编辑:我通过不使用glDrawRangeElements调用解决了一个简单的glDrawArrays调用,重新排列矩形的顶点以绘制两个三角形;

1 个答案:

答案 0 :(得分:1)

glDrawRangeElements没有按照您的想法行事。 glDrawRangeElements功能与<{1}} 相同。唯一的区别是glDrawElements将一个作为提示的范围作为实现,以确定您将使用哪些顶点。

请参阅,因为您的索引位于数组中,驱动程序不会自动知道您正在使用的顶点数据的哪个部分。您使用glDrawRangeElements作为潜在的性能增强器;它可以让你告诉驱动程序你的绘制调用使用的顶点范围。

如今,glDrawRangeElements毫无意义。请参阅用于重要的范围,因为用于从CPU内存中读取顶点数组的实现。因此,当您执行常规glDrawRangeElements时,驱动程序必须读取索引缓冲区,找出顶点数据的范围,然后将数据从顶点缓冲区复制到GPU内存中,然后发出绘制调用。 glDrawElements版本允许它跳过昂贵的索引读取步骤。

这无关紧要,因为现在我们将顶点数据存储在GPU上的缓冲区对象中。所以你根本不应该使用Range