Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.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
Opengl 在VBO中更新顶点数据(glBufferSubData与glMapBuffer)_Opengl_Vertex Buffer - Fatal编程技术网

Opengl 在VBO中更新顶点数据(glBufferSubData与glMapBuffer)

Opengl 在VBO中更新顶点数据(glBufferSubData与glMapBuffer),opengl,vertex-buffer,Opengl,Vertex Buffer,我想在创建VBO后更新对象的顶点列表。我已经看到了glBufferSubData和glMapBuffer,它们似乎都做了类似的事情,这意味着我现在不确定使用哪一个 我的伪工作流是: 创建对象 开始顶点更新(使用data=nullptr调用glBufferData) 更新对象的顶点 结束顶点更新(获取更新的顶点并调用glBufferSubData或glMapBuffer) 两者都有效 如果您打算经常更新顶点(每帧左右),我建议避免使用glBufferSubData,这需要在驱动程序中增加一个mem

我想在创建VBO后更新对象的顶点列表。我已经看到了
glBufferSubData
glMapBuffer
,它们似乎都做了类似的事情,这意味着我现在不确定使用哪一个

我的伪工作流是:

创建对象
开始顶点更新(使用data=nullptr调用glBufferData)
更新对象的顶点
结束顶点更新(获取更新的顶点并调用
glBufferSubData
glMapBuffer

两者都有效

如果您打算经常更新顶点(每帧左右),我建议避免使用glBufferSubData,这需要在驱动程序中增加一个memcpy。glMapBuffer/glMapBufferRange通常可以让您获得更高的性能

如果只很少更新,glBufferSubData就可以了


另请参见OpenGL Insights(免费:)的第28章。

gl…数据并不一定需要复制数据。一个好的驱动程序只需压缩页面,并从已经分配的内存直接进行DMA传输。在我最近编写的驱动程序(不是图形)中,情况与此完全相同。@datenwolf:聪明。。。但这也意味着在glXData之后删除数据是一个非常糟糕的主意,对吗?@Calvin1602:为什么会有问题呢。CoW的全部要点是,流程对数据所做的任何操作都将创建这些操作发生的现场副本。驱动程序对数据所做的任何更改也是如此。无论谁先修改数据,都会在副本上进行修改。@DatenWalf:准确地说,因此删除[]或删除[]数据将(可能)强制使用memcpy(至少在第一页上),这会破坏CoW的优势。@Calvin1602:根据使用的分配器,删除/释放只会取消页面映射。在这种情况下,将删除一个CoW引用,这意味着由驱动程序修改数据将不再触发复制。此外,每页都会发生重复,而不是在完整的数据上。但是,标准malloc/new调用来自内存池,在空闲/删除时不会返回给操作系统。这就是glMapBuffer更有效的情况。但是,如果您的数据来自mmap ed文件或类似文件,则可以选择glBufferData方法。相关: