【问题标题】:What is the most efficient way to manage a large set of lines in OpenGL?在 OpenGL 中管理大量线条的最有效方法是什么?
【发布时间】:2008-12-01 21:25:48
【问题描述】:

我正在开发一个使用 OpenGL 处理屏幕渲染的简单 CAD 程序。屏幕上绘制的每个形状都完全由简单的线段构成,因此即使是简单的绘图也最终会处理数千条单独的线。

在我的应用程序和 OpenGL 之间传达此行集合中的更改的最佳方式是什么?有没有办法只更新 OpenGL 缓冲区中的特定行子集?

我在这里寻找一个概念性的答案。无需深入实际的源代码,只是对数据结构和通信的一些建议。

【问题讨论】:

    标签: opengl performance conceptual


    【解决方案1】:

    您可以使用简单的方法,例如使用显示列表(glNewList/glEndList)

    另一个稍微复杂一点的选项是使用顶点缓冲区对象(VBO - GL_ARB_vertex_buffer_object)。它们的优点是可以动态更改,而显示列表则不能。

    这些基本上是批量处理您的所有数据/转换,然后在 GPU 上执行(假设您使用的是硬件加速),从而提高性能。

    【讨论】:

      【解决方案2】:

      顶点缓冲区对象可能是您想要的。加载原始数据集后,您可以使用glBufferSubData() 对现有块进行修改。

      如果您添加额外的线段并溢出缓冲区的大小,您当然必须创建一个新的缓冲区,但这与在 C 中当某些东西增长时必须分配一个新的、更大的内存块没有什么不同。

      编辑:关于显示列表的几点说明,以及为什么不使用它们:

      1. 在 OpenGL 3.0 中,显示列表已被弃用,因此在 3.0 之后使用它们不能向前兼容(当然,2.1 实现将存在一段时间,因此这可能不是问题)
      2. 每当您更改任何内容时,都必须重新构建整个显示列表,如果经常更改,这将违背显示列表的全部目的。

      【讨论】:

        【解决方案3】:

        不确定您是否已经这样做了,但值得一提的是,如果可能,您应该尝试使用 GL_LINE_STRIP 而不是单独的 GL_LINES,以减少发送到卡的顶点数据量。

        【讨论】:

          【解决方案4】:

          我的建议是尝试使用场景图,一种用于线条/曲线的分层数据结构。如果你有巨大的模型,如果你有简单的行列表,性能会受到影响。使用图形/树结构,您可以使用包围体轻松检查哪些项目可见,哪些不可见。此外,您还可以使用场景图轻松应用变换并重用几何图形。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2022-09-28
            • 1970-01-01
            • 2011-01-13
            相关资源
            最近更新 更多