Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/151.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 存储几何图形';s指数_C++_Opengl_Architecture - Fatal编程技术网

C++ 存储几何图形';s指数

C++ 存储几何图形';s指数,c++,opengl,architecture,C++,Opengl,Architecture,我已经读了很多关于OpenGL的东西,我有一些关于“架构”的问题 OpenGL有缓冲区,所以在类中存储几何体的数据是有用的?我可以在实时OpenGL缓冲区中编辑,对吗 OpenGL索引缓冲区可以处理GL_UNSIGNED_BYTE、GL_UNSIGNED_SHORT和GL_UNSIGNED_INT,在我的类中如何管理这些不同的类型?我是否需要创建一个无符号int向量,一个短向量 管理索引的无符号int、无符号字节和无符号缩写有用吗?我这样问是因为只存储未签名的空头将不那么痛苦,并且可以允许大小型

我已经读了很多关于OpenGL的东西,我有一些关于“架构”的问题

  • OpenGL有缓冲区,所以在类中存储几何体的数据是有用的?我可以在实时OpenGL缓冲区中编辑,对吗
  • OpenGL索引缓冲区可以处理GL_UNSIGNED_BYTE、GL_UNSIGNED_SHORT和GL_UNSIGNED_INT,在我的类中如何管理这些不同的类型?我是否需要创建一个无符号int向量,一个短向量
  • 管理索引的无符号int、无符号字节和无符号缩写有用吗?我这样问是因为只存储未签名的空头将不那么痛苦,并且可以允许大小型号

  • 关于你的问题:

  • OpenGL有缓冲区,所以在类中存储几何体的数据是有用的?我可以在实时OpenGL缓冲区中编辑,对吗
  • 这取决于您打算更新数据的频率,以及您正在使用的GPU的类型。如果您使用的是离散的“桌面”GPU(如NVIDIA或ATI/AMD),OpenGL缓冲区将分配到图形卡的内存中,并且编辑(通过调用
    glMapBuffer
    或vairants)缓冲区通常需要将数据从GPU复制回CPU内存,或保留“卷影副本”在编辑后发送到GPU的CPU中的数据。无论哪种方式,编辑缓冲区中的数据都可能导致延迟

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

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

  • OpenGL索引缓冲区可以处理GL_UNSIGNED_BYTE、GL_UNSIGNED_SHORT和GL_UNSIGNED_INT,在我的类中如何管理这些不同的类型?我是否需要创建一个无符号int向量,一个短向量
  • 不需要,根据需要索引的顶点数量,您只需要一个最合适类型的缓冲区。例如,使用
    GL\u UNSIGNED\u BYTE
    索引只能访问256个顶点

  • 管理索引的无符号int、无符号字节和无符号缩写有用吗?我这样问是因为只存储未签名的空头将不那么痛苦,并且可以允许大小型号

  • 同样,用于索引的数据类型实际上只对要访问的顶点数量重要,因此如果
    GLushort
    是最佳存储格式,那么就使用它

    你问的只是设计选择的问题。最好是采用适合您需求的实现,只有在您无法处理某个功能时才进行更改。在这一点上,你将有一些工作,它将更容易作出改变,以支持新的东西。 我建议使用
    unsigned int
    作为索引,索引缓冲区作为
    std::vector
    直接存储在内存中,以便于使用


    技术上,正确的术语是“DeStency”。我建议你在开始使用像OpenGL那样先进的东西之前,要充分学习和理解C++。而且,你几乎从不想使用无符号字节来存储索引。是否使用unsigned int或unsigned short取决于是否可以将所有内容都放入unsigned short。请使用尽可能最小的类型,但避免使用
    GL\u unsigned\u BYTE
    ,它不是一种硬件友好的索引类型。使用较小的类型可以减少存储/总线通信量,这是一种双赢的方式,只要硬件支持该类型(16-/32位类型在桌面GPU上普遍受支持)。+1:但关于使用基于顶点数的“最合适类型”,请注意,我应该补充一点,桌面GPU不能为post-T&L缓存使用8位索引(它们只支持16/32位)。这通常意味着,如果使用8位元素数组,驱动程序将在运行时将元素填充到16位,并且从长远来看,您不会保存任何内存,只会为驱动程序添加额外的工作。在D3D中,甚至不支持8位索引,我认为在嵌入式图形设备上,硬件是否支持它们更是一个灰色地带。