2014-12-06 97 views
0

我正在实现一个带有“时间轴”的QT OpenGL应用程序,该程序允许用户通过一些动画3D几何体进行扫描 - 即清理时间线应触发导致VBO数据重新绑定的事件它被正确地重新绘制。快速修改OpenGL VAO缓冲区

我只能重新绑定在时间轴上两个时间点之间更改的内存部分(聚合两个时间点之间的所有增量),但看起来相当昂贵。天真地只要在时间点变化事件中重新绑定所有VBO数据并记录存储器中每帧的所有VBO数据就够了吗?

+1

另请参阅:https://www.opengl.org/wiki/Buffer_Object_Streaming – 2014-12-06 18:50:04

回答

0

(我假设在这里,你单独动画顶点,而不是用骨头之类的东西,带骨头的情况是相似的。)

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

理想情况下,您希望获得的关键帧列表中每个关键帧都有时间,由关键帧将其作为矢量+偏移列表和插值数据进行动画的顶点列表。你发送给顶点着色器的是VBO之前的“VBO”,以及“之后的VBO”。然后,顶点着色器进行插值。

这样,当你洗刷一个点时,你只需要glBufferSubData VBO之前和之后不同的部分(即,你已经通过的每个关键帧,如果有的话)和glUniform1f alpha。您可以采取一些启发式措施以避免过多的呼叫,即在您进行5次以上呼叫时重新发送整个缓冲区。

+0

如果每个帧都有关键帧会怎么样?我并不完全使用动画数据,更像是延时的FMRI序列。 – ejang 2014-12-06 18:46:57