glDrawRangeElements 不绘制所选范围

glDrawRangeElements doesn't draw the chosen range

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

glDrawElements(GL_TRIANGLES, 36, GL_UNSIGNED_INT, 0);

然后,为了绘制矩形,我尝试使用 glDrawRangeElements

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

但它只是绘制立方体的底部。

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

我想我对 glDrawRangeElements 参数做错了,因为我尝试只调用第一个立方体然后调用矩形

glDrawElements(GL_TRIANGLES, 42, GL_UNSIGNED_INT, 0);

而且有效。

glDrawRangeElements 调用有什么问题?

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

glDrawRangeElements 并不像您想象的那样。 glDrawRangeElements 功能 glDrawElements 相同。唯一的区别是 glDrawRangeElements 接受一个范围作为 提示 来实现你将使用的顶点。

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

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

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