快速修改OpenGL VAO缓冲区

时间:2014-12-06 16:25:01

标签: c++ opengl vbo timeline

我正在使用"时间线"来实施QT OpenGL应用程序。允许用户擦洗一些动画3D几何体 - 即擦洗时间线应触发导致VBO数据重新绑定的事件,以便正确地重新绘制。

我只能重新绑定在时间线上两个时间点之间发生变化的内存部分(聚合两个时间点之间的所有增量),但这看起来非常昂贵。是否只需要在时间点更改事件上重新绑定所有VBO数据,并跟踪内存中每个帧的所有VBO数据?

1 个答案:

答案 0 :(得分:0)

(我在这里假设您是单独设置顶点而不是使用骨骼或其他东西。骨骼的情况类似。)

问题是,每帧拥有完整的VBO副本是一大堆内存。

理想情况下,您希望拥有的是每个都有时间的关键帧列表,由关键帧设置动画的顶点作为矢量+偏移列表以及插值数据。您要发送到顶点着色器的是“之前”VBO,“之后”VBO是alpha。然后,顶点着色器进行插值。

这样,当你擦洗到一个点时,你只需要glBufferSubData不同的VBO之前和之后的部分(即你传递的每个关键帧,如果有的话)和{ {1}}阿尔法。您可以进行一些启发式操作以避免过多的glUniform1f调用,即当您执行超过5次调用时重新发送整个缓冲区。