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
。
我想绘制两个立方体,它们之间有一个矩形,所以我将顶点数据存储到一个 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
。