我刚刚开始学习 C++ 中的顶点缓冲区对象。我正在读一本关于 OpenGL 的书,书中说 VBO 渲染比其他形式的渲染更高效,因为数据存储在 GPU 上而不是堆上。但是,我很困惑如果您仍然需要将数据数组从堆加载到 GPU,这会是怎么回事。每隔几秒钟,我就会更新程序的顶点数据,这意味着我必须使用glBufferData()
刷新数据以更新到新状态。我不明白这比正常渲染数组更有效。我想知道我是否正在打电话glBufferData()
超出必要的范围,或者是否有更好的方法直接在 GPU 上更新顶点数据。
Well, glBufferData (...)
做的比你想象的更多。确实,它向 VBO 提供数据,但更重要的一点是,它在服务器端(用于所有意图和目的的 GPU)分配内存用于顶点存储。
在您的示例中,刷新数据时,顶点数量以及存储它们所需的大小似乎没有变化。你实际上应该做的是打电话glBufferSubData (...)
更新数据而不为其重新分配空间。加上正确的使用标志(例如GL_DYNAMIC_DRAW
)这比每次绘制内容时从客户端复制到服务器要高效得多。
考虑到glBufferData (...)
作为一个组合malloc (...)
and memcpy (...)
. glBufferSubData (...)
另一方面是memcpy (...)
。为此,您甚至可以将 VBO 的内存映射到应用程序的地址空间,而无需使用以下命令在客户端和服务器中分配存储glMapBuffer (...)
and glUnmapBuffer (...)
,这类似于mmap (...)
and munmap (...)
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)