【发布时间】:2013-11-27 17:47:12
【问题描述】:
我刚刚开始学习 C++ 中的顶点缓冲区对象。我正在阅读一本关于 OpenGL 的书,它说 VBO 渲染比其他形式的渲染更有效,因为数据存储在 GPU 上而不是堆上。但是,如果您仍然必须将一组数据从堆加载到 GPU,我会感到困惑。每隔几秒钟,我就会更新程序的顶点数据,这意味着我必须使用glBufferData() 刷新数据以更新到新状态。我看不出这比正常渲染数组更有效。我想知道我是否对glBufferData() 的调用超出了必要的范围,或者是否有更好的方法可以直接在 GPU 上更新顶点数据。
【问题讨论】:
-
您是通过一个全新的缓冲区发送还是只是发生了变化?另外,你为什么要发送一个新的缓冲区?如果是用于动画,请考虑将动画的“关键帧”作为多个缓冲区发送并将它们绑定到着色器中,然后将原始网格变形为关键帧。
-
我正在发送一个全新的缓冲区,我认为我的书还没有超越所有其他内容,在所有书籍示例中,整个程序的顶点都保持不变。
-
有一种更好的方法可以在 GPU 上更新顶点数据。它们被称为顶点着色器,如果您可以通过一些静态输入数据以编程方式计算每个顶点的位置,那么这将始终在性能方面胜出。希望你的书不是太古老以至于它不包括顶点着色器; VBO 和顶点程序大约在同一时间被引入 OpenGL,但 GLSL 和顶点着色器在几年后被引入。我怀疑很多书都涉及顶点程序,因为它们是一种很快被 GLSL 取代的汇编语言。