存储几何的索引

时间:2013-10-09 08:01:06

标签: c++ opengl architecture

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

  1. OpenGL有Buffers,因此,将几何数据存储在类中是有用的吗?我可以在实时OpenGL缓冲区中编辑,对吗?
  2. OpenGL索引缓冲区可以处理GL_UNSIGNED_BYTE,GL_UNSIGNED_SHORT和GL_UNSIGNED_INT,在我的课程中如何管理这些不同的类型?我是否需要创建一个unsigned int向量,一个short的向量,......?
  3. 管理unsigned int,无符号字节和索引的unsigned short是否有用?我问的是,因为存储无符号的短片会减少痛苦,并且可以允许小型和大型模型。

2 个答案:

答案 0 :(得分:2)

关于你的问题:

  
      
  1. OpenGL有Buffers,因此,将几何数据存储在类中是有用的吗?我可以在实时OpenGL缓冲区中编辑,对吗?
  2.   

这取决于您打算更新数据的频率以及您正在使用的GPU类型。如果您使用的是离散的“桌面”GPU(例如,NVIDIA或ATI / AMD),则会在显卡的内存中分配OpenGL缓冲区,并且编辑(通过调用glMapBuffer或vairants)缓冲区通常需要复制GPU中的数据返回到CPU的内存,或者在CPU中保留数据的“阴影副本”,并在编辑后发送到GPU。无论哪种方式,您都可能通过编辑缓冲区中的数据来延迟。

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

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

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

不,根据您需要索引的顶点数量,您只需要一个最合适类型的缓冲区。例如,您只能使用GL_UNSIGNED_BYTE索引访问256个顶点。

  
      
  1. 管理unsigned int,无符号字节和索引的unsigned short是否有用?我问的是,因为存储无符号的短片会减少痛苦,并且可以允许小型和大型模型。
  2.   

再次,您用于索引的数据类型实际上仅对您要访问的顶点数量很重要,因此如果GLushort是最佳存储格式,请选择它。

答案 1 :(得分:0)

您所询问的只是设计选择的问题。最好选择适合您需求的实现,只有在无法处理功能时才进行更改。此时,您将拥有一些工作,并且更容易进行更改以支持新内容。 我建议使用unsigned int作为索引,并将索引缓冲区直接作为std::vector<unsigned int>直接在内存中使用。

勒兹。