我读过很多关于OpenGL的文章,我也有一些关于“架构”的问题。
发布于 2013-10-09 14:33:17
关于你的问题:
这取决于您打算更新数据的频率,以及您使用的GPU类型。如果您使用的是独立的“桌面”GPU (例如,NVIDIA或ATI/AMD),则在图形卡的内存上分配OpenGL缓冲区,而编辑(通过调用glMapBuffer或vairants)缓冲区通常需要将数据从GPU复制回CPU的内存,或者将数据的“影子副本”保存在CPU中,在编辑后发送到GPU。无论哪种方式,编辑缓冲区中的数据都可能导致延迟。
编辑数据的另一种方法--通常也是更好的--是使用glBufferSubData替换缓冲区的一部分,这可能有助于减少映射和取消映射缓冲区的影响,以便进行交互编辑。此调用需要CPU内存中的数据数组,这些数据将被复制到GPU以替换缓冲区中的数据。可以使用glBufferSubData发送的数据量必须小于原始缓冲区的大小。
关于将数据保存在类中,如果要经常更改数据,那么最好的方法可能是保留一个本地副本,然后使用glBufferSubData将其发送到GPU。
不,根据需要索引的顶点数,只需要一个最合适类型的缓冲区。例如,您只能使用GL_UNSIGNED_BYTE索引访问256个顶点。
同样,用于索引的数据类型实际上只对要访问多少个顶点很重要,所以如果GLushort是最好的存储格式,那么就选择它。
发布于 2013-10-09 14:35:34
你要求的只是一个设计选择的问题。最好是选择一个适合您需要的实现,并且只有当您无法处理某个特性时才对其进行更改。在这一点上,您将有一些工作,它将更容易作出改变,以支持新的东西。为了便于使用,我建议直接在内存中使用unsigned int作为索引,使用索引缓冲区作为std::vector<unsigned int>。
拉兹文。
https://stackoverflow.com/questions/19266261
复制相似问题