【问题标题】:glDrawRangeElements doesn't draw the chosen rangeglDrawRangeElements 不绘制所选范围
【发布时间】:2016-09-15 13:09:27
【问题描述】:

我想绘制两个立方体,它们之间有一个矩形,所以我将顶点数据存储到一个 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 调用来解决,重新排列矩形的顶点以绘制两个三角形;

【问题讨论】:

    标签: c++ opengl vbo


    【解决方案1】:

    glDrawRangeElements 不会做你认为的那样。 glDrawRangeElements功能glDrawElements相同。唯一的区别是glDrawRangeElements 采用一个范围作为实现的提示关于您将使用哪些顶点。

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

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

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

    【讨论】:

    • 那么怎么才能只画一部分元素呢?
    猜你喜欢
    • 1970-01-01
    • 2020-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-17
    • 2018-10-26
    • 1970-01-01
    相关资源
    最近更新 更多