【问题标题】:Questions about glDrawRangeElements()关于 glDrawRangeElements() 的问题
【发布时间】:2011-11-24 21:16:02
【问题描述】:

我正在尝试使用 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);

正确吗?有没有人认为这有点违反直觉?关于顶点数组的任何其他建议?

【问题讨论】:

    标签: c++ opengl render


    【解决方案1】:

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

    因此,如果要渲染 30 个索引,请将 30 作为计数。

    既然我们知道如何使用glDrawElements,那么我们来谈谈glDrawRangeElements。正常使用glDrawElements 时,您指定要从中提取的源索引数组中的位置。 indicescount 参数告诉 OpenGL 在哪里找到索引。但从该数组中提取的实际索引可能在源顶点数组索引边界内的任意位置

    glDrawRangeElements 允许您为 OpenGL 提供一个 顶点索引 值的范围(包括在内,因为这很有意义)。您的意思是,它在此绘制调用期间获得的索引不会超过该范围。这可以允许驱动程序执行有用的优化。 start 值应该是将从索引数组中获取的最低索引值,end 应该是最高的。它应该只是第一个和最后一个顶点的索引。

    【讨论】:

    • 你应该教一堂课,因为你解释得很好。我将更正代码中的一些错误,然后重试。
    • 还有一个问题需要进一步澄清。想象一下,我有两个要渲染的三角形的索引 {2, 11, 6, 4, 0, 3},只是为了示例的目的,我想分两批渲染它们。第一个三角形是(假设索引类型是字节): glDrawRangeElements(GL_TRIANGLES, 2, 11, 3, GL_UNSIGNED_BYTE, indices);第二个是 glDrawRangeElements(GL_TRIANGLES, 0, 4, 3, GL_UNSIGNED_BYTE, indices + 3); - 那是对的吗?如果是这种情况,我需要知道每个渲染批次中的最高和最低索引。
    • @Nicole Bolas 非常感谢
    • glDrawElements 不会在 29 上引发 INVALID_OP。它使用 27 绘制,并丢弃最后一个 2。
    • 通过阅读规范,您关于 startend 范围是“半开”的声明似乎不正确。规范说“索引引用的所有顶点必须位于startend inclusive 之间。”因此,end 值应设置为最高引用索引值,而不是最高引用索引值 + 1。
    猜你喜欢
    • 1970-01-01
    • 2021-11-29
    • 2011-09-22
    • 2018-05-23
    • 2011-11-16
    • 2021-03-27
    • 2017-01-27
    • 2011-10-31
    • 2011-01-19
    相关资源
    最近更新 更多