关于您的问题:
- OpenGL有缓冲区,那么将几何数据存储在一个类中是否有用?我可以在实时 OpenGL 缓冲区中进行编辑,对吗?
这取决于您打算多久更新一次数据,以及您使用的 GPU 类型。如果您使用的是独立的“桌面”GPU(例如,NVIDIA 或 ATI/AMD),OpenGL 缓冲区分配在显卡的内存上,并且编辑(通过调用glMapBuffer
或变体)缓冲区通常需要从 GPU 复制数据回到 CPU 的内存,或者在 CPU 中保留数据的“影子副本”,在编辑后发送到 GPU。无论哪种方式,您都可能会因编辑缓冲区中的数据而导致延迟。
编辑数据的另一种(通常是更好的)方法是使用 替换缓冲区的一部分glBufferSubData
,这可能有助于减少映射和取消映射缓冲区以进行交互式编辑的影响。此调用需要 CPU 内存中的数据数组,这些数据将被复制到 GPU 以替换缓冲区中的数据。您可以发送的数据量glBufferSubData
必须小于原始缓冲区的大小。
关于将数据保存在一个类中,如果您将经常更改数据,那么您最好的方法可能是保留一个本地副本,然后glBufferSubData
将其发送到 GPU。
- OpenGL 索引缓冲区可以处理 GL_UNSIGNED_BYTE、GL_UNSIGNED_SHORT 和 GL_UNSIGNED_INT,在我的课堂上我该如何管理这些不同的类型?我是否需要创建一个 unsigned int 向量、一个 short 向量……?
不,您只需要一个最合适类型的缓冲区,具体取决于您需要索引多少个顶点。例如,您只能使用GL_UNSIGNED_BYTE
索引访问 256 个顶点。
- 管理无符号整数、无符号字节和无符号短索引是否有用?我之所以这样问,是因为只存储 unsigned short 会不那么痛苦,并且可以允许小型和大型模型。
再一次,你用于索引的数据类型真的只对你想要访问多少个顶点很重要,所以如果GLushort
是最好的存储格式,那就去吧。