我刚刚开始学习 C++ 中的顶点缓冲区对象。我正在读一本关于 OpenGL 的书,它说 VBO 渲染比其他形式的渲染更有效,因为数据存储在 GPU 上而不是堆上。但是,我很困惑,如果您仍然必须将一组数据从堆加载到 GPU,这会是怎么回事。每隔几秒钟,我就会更新我程序的顶点数据,这意味着我必须随后使用glBufferData()来刷新数据以更新到新状态。我看不出这比正常渲染数组更有效率。我想知道我是否调用glBufferData()了不必要的调用,或者是否有更好的方法来直接在 GPU 上更新顶点数据。
嗯,glBufferData (...)做的比你想象的要多。确实,它向 VBO 提供数据,但更重要的一点是它在服务器端(用于所有意图和目的的 GPU)分配内存用于顶点存储。
在您的示例中,当您刷新数据时,顶点的数量以及存储它们所需的大小似乎没有变化。您实际上应该做的是调用glBufferSubData (...)更新数据而不为其重新分配空间。再加上正确的使用标志(例如GL_DYNAMIC_DRAW),这比每次绘制内容时从客户端复制到服务器更有效。
想想glBufferData (...)作为组合malloc (...)和memcpy (...)。glBufferSubData (...)另一方面是memcpy (...)。为此,您甚至可以将 VBO 的内存映射到您的应用程序的地址空间,而无需在客户端和服务器中使用glMapBuffer (...)and分配存储glUnmapBuffer (...),这类似于mmap (...)and munmap (...)。
| 归档时间: |
|
| 查看次数: |
1033 次 |
| 最近记录: |