我已经阅读了很多关于OpenGL的内容,我对“架构”有一些疑问。
答案 0 :(得分:2)
关于你的问题:
- OpenGL有Buffers,因此,将几何数据存储在类中是有用的吗?我可以在实时OpenGL缓冲区中编辑,对吗?
醇>
这取决于您打算更新数据的频率以及您正在使用的GPU类型。如果您使用的是离散的“桌面”GPU(例如,NVIDIA或ATI / AMD),则会在显卡的内存中分配OpenGL缓冲区,并且编辑(通过调用glMapBuffer
或vairants)缓冲区通常需要复制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 int,无符号字节和索引的unsigned short是否有用?我问的是,因为存储无符号的短片会减少痛苦,并且可以允许小型和大型模型。
醇>
再次,您用于索引的数据类型实际上仅对您要访问的顶点数量很重要,因此如果GLushort
是最佳存储格式,请选择它。
答案 1 :(得分:0)
您所询问的只是设计选择的问题。最好选择适合您需求的实现,只有在无法处理功能时才进行更改。此时,您将拥有一些工作,并且更容易进行更改以支持新内容。
我建议使用unsigned int
作为索引,并将索引缓冲区直接作为std::vector<unsigned int>
直接在内存中使用。
勒兹。