0

我已经阅读了很多关于 OpenGL 的内容,并且对“架构”有一些疑问。

  1. OpenGL有缓冲区,那么将几何数据存储在一个类中是否有用?我可以在实时 OpenGL 缓冲区中进行编辑,对吗?
  2. OpenGL 索引缓冲区可以处理 GL_UNSIGNED_BYTE、GL_UNSIGNED_SHORT 和 GL_UNSIGNED_INT,在我的课堂上我该如何管理这些不同的类型?我是否需要创建一个 unsigned int 向量、一个 short 向量……?
  3. 管理无符号整数、无符号字节和无符号短索引是否有用?我之所以这样问,是因为只存储 unsigned short 会不那么痛苦,并且可以允许小型和大型模型。
4

2 回答 2

2

关于您的问题:

  1. OpenGL有缓冲区,那么将几何数据存储在一个类中是否有用?我可以在实时 OpenGL 缓冲区中进行编辑,对吗?

这取决于您打算多久更新一次数据,以及您使用的 GPU 类型。如果您使用的是独立的“桌面”GPU(例如,NVIDIA 或 ATI/AMD),OpenGL 缓冲区分配在显卡的内存上,并且编辑(通过调用glMapBuffer或变体)缓冲区通常需要从 GPU 复制数据回到 CPU 的内存,或者在 CPU 中保留数据的“影子副本”,在编辑后发送到 GPU。无论哪种方式,您都可能会因编辑缓冲区中的数据而导致延迟。

编辑数据的另一种(通常是更好的)方法是使用 替换缓冲区的一部分glBufferSubData,这可能有助于减少映射和取消映射缓冲区以进行交互式编辑的影响。此调用需要 CPU 内存中的数据数组,这些数据将被复制到 GPU 以替换缓冲区中的数据。您可以发送的数据量glBufferSubData必须小于原始缓冲区的大小。

关于将数据保存在一个类中,如果您将经常更改数据,那么您最好的方法可能是保留一个本地副本,然后glBufferSubData将其发送到 GPU。

  1. OpenGL 索引缓冲区可以处理 GL_UNSIGNED_BYTE、GL_UNSIGNED_SHORT 和 GL_UNSIGNED_INT,在我的课堂上我该如何管理这些不同的类型?我是否需要创建一个 unsigned int 向量、一个 short 向量……?

不,您只需要一个最合适类型的缓冲区,具体取决于您需要索引多少个顶点。例如,您只能使用GL_UNSIGNED_BYTE索引访问 256 个顶点。

  1. 管理无符号整数、无符号字节和无符号短索引是否有用?我之所以这样问,是因为只存储 unsigned short 会不那么痛苦,并且可以允许小型和大型模型。

再一次,你用于索引的数据类型真的只对你想要访问多少个顶点很重要,所以如果GLushort是最好的存储格式,那就去吧。

于 2013-10-09T14:33:17.173 回答
0

您要问的只是设计选择的问题。最好选择适合您需求的实现,并且仅在您无法处理某个功能时进行更改。在这一点上,您将有一些工作,并且更容易进行更改以支持新内容。我建议将其unsigned int用作索引,并将索引缓冲区std::vector<unsigned int>直接用作内存以便于使用。

拉兹万。

于 2013-10-09T14:35:34.563 回答