在OpenGL中何时使用glBufferData 我刚刚开始学习C++中的顶点缓冲对象。我正在读一本关于OpenGL的书,书中说VBO渲染比其他形式的渲染更有效,因为数据存储在GPU上而不是堆上。但是,我很困惑,如果您仍然必须将一组数据从堆加载到GPU,这会是什么情况。每隔几秒钟,我就会更新程序的顶点数据,这意味着我必须使用glBufferData()刷新数据以更新到新状态。我不认为这比正常渲染数组更有效。我想知道我调用的glBufferData()是否超出了必要的范围,或者是否有更好的方法直接在GPU上更新顶点数据。

在OpenGL中何时使用glBufferData 我刚刚开始学习C++中的顶点缓冲对象。我正在读一本关于OpenGL的书,书中说VBO渲染比其他形式的渲染更有效,因为数据存储在GPU上而不是堆上。但是,我很困惑,如果您仍然必须将一组数据从堆加载到GPU,这会是什么情况。每隔几秒钟,我就会更新程序的顶点数据,这意味着我必须使用glBufferData()刷新数据以更新到新状态。我不认为这比正常渲染数组更有效。我想知道我调用的glBufferData()是否超出了必要的范围,或者是否有更好的方法直接在GPU上更新顶点数据。,c++,opengl,vbo,C++,Opengl,Vbo,嗯,glBufferData(…)做的比你想象的要多。的确,它向VBO提供数据,但更重要的一点是,它在服务器端(出于所有目的和目的的GPU)为顶点存储分配内存 在您的示例中,当刷新数据时,顶点的数量以及存储顶点所需的大小似乎没有改变。您实际上应该做的是调用glBufferSubData(…)来更新数据,而不为其重新分配空间。再加上一个正确的使用标志(例如,GL\u DYNAMIC\u DRAW),这比每次从客户机复制到服务器要高效得多 将glBufferData(…)看作是malloc(…)和m

嗯,
glBufferData(…)
做的比你想象的要多。的确,它向VBO提供数据,但更重要的一点是,它在服务器端(出于所有目的和目的的GPU)为顶点存储分配内存

在您的示例中,当刷新数据时,顶点的数量以及存储顶点所需的大小似乎没有改变。您实际上应该做的是调用
glBufferSubData(…)
来更新数据,而不为其重新分配空间。再加上一个正确的使用标志(例如,
GL\u DYNAMIC\u DRAW
),这比每次从客户机复制到服务器要高效得多


glBufferData(…)
看作是
malloc(…)
memcpy(…)
的组合
glBufferSubData(…)
另一方面是
memcpy(…)
。为此,您甚至可以使用
glMapBuffer(…)
glUnmapBuffer(…)
将VBO的内存映射到应用程序的地址空间,而无需在客户端和服务器中分配存储,这两种方法类似于
mmap(…)
munmap(…)

应尽量避免每隔几帧修改顶点数据。顶点/片段着色器专门用于允许您动态修改几何体,当然有一些限制


然而,在最简单的情况下(如果您不关心性能的最大化),完全有可能在每一帧上重写缓冲区,并且它应该仍然优于调用
glBegin
glEnd

您是在发送一个全新的缓冲区,还是刚刚更改了什么?还有,为什么要发送一个新的缓冲区?如果是动画,考虑将动画的“关键帧”发送为多个缓冲区,并将它们绑定到着色器中,然后将原始网格变形为关键帧。我正在发送一个全新的缓冲器,但我认为我的书已经没有其他内容了。在所有的书籍示例中,顶点在整个程序中保持不变。有一种更好的方法可以更新GPU上的顶点数据。它们被称为顶点着色器,如果您可以从一些静态输入数据以编程方式计算每个顶点的位置,那么这将始终赢得性能方面的支持。希望你的书不是那么古老,它没有涵盖顶点着色器;VBOs和顶点程序大约是在同一时间引入OpenGL的,但GLSL和顶点着色器是在几年后引入的。我怀疑很多书都涉及顶点程序,因为它们是一种汇编语言,很快就被GLSL所取代。