【问题标题】:OpenGL - glDrawElements vs Vertex Array ObjectsOpenGL - glDrawElements vs 顶点数组对象
【发布时间】:2016-06-23 08:08:52
【问题描述】:

我需要帮助来了解它们之间的权衡。

  • 在我看来,glDrawElements() 需要将索引数据“实时”作为参数。
  • 另一方面,如果我使用 VAO,那么在启动期间我会缓冲数据,驱动程序可能会决定将其放在 GPU 上,然后在渲染期间我只绑定 VAO 并调用glDrawArrays() .

有没有办法结合优势?我们也可以缓冲索引数据吗?

那在顶点着色器中会是什么样子?是否可以使用索引在顶点位置数组中查找?

【问题讨论】:

    标签: opengl vao


    【解决方案1】:

    这个信息确实有点难找,但也可以将glDrawElements 与 VAO 结合使用。然后可以(但不是必须)由ELEMENT_ARRAY_BUFFER 提供索引数据。然后索引像往常一样工作,不必在顶点着色器中做任何特别的事情。 OpenGL 已确保在原始组装期间以正确的方式使用索引。

    spec 在第 10.3.10 节中对此进行了说明:

    DrawElements、DrawRangeElements 和 DrawElementsInstanced 源 它们的索引来自名称绑定到 ELEMENT_- 的缓冲区对象 ARRAY_BUFFER,使用它们的索引参数作为缓冲区对象的偏移量

    这基本上意味着,每当绑定 ELEMENT_ARRAY_BUFFER 时,indices 参数将用作此缓冲区的偏移量(0 表示从头开始)。当没有绑定这样的缓冲区时,索引指针指定索引数组的地址。

    【讨论】:

    • 由于问题是关于 VAO,还值得一提的是 GL_ELEMENT_ARRAY_BUFFER 绑定是 VAO 状态的一部分。因此,您可以在 VAO 设置期间绑定一次缓冲区,而不必在每次绘制调用之前再次显式绑定它。这将作为绑定 VAO 的一部分发生。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多