快速修改 OpenGL VAO 缓冲区

Posted

技术标签:

【中文标题】快速修改 OpenGL VAO 缓冲区【英文标题】:Fast modification of OpenGL VAO buffers 【发布时间】:2014-12-06 16:25:00 【问题描述】:

我正在实现一个带有“时间线”的 QT OpenGL 应用程序,该应用程序允许用户通过一些动画 3D 几何图形进行清理 - 即清理时间线应该触发导致 VBO 数据重新绑定的事件,以便重新绘制它适当地。

我只能重新绑定在时间轴上的两个时间点之间发生变化的内存部分(聚合两个时间点之间的所有增量),但这似乎相当昂贵。天真地在时间点更改事件上重新绑定所有 VBO 数据并跟踪内存中每一帧的所有 VBO 数据就足够了吗?

【问题讨论】:

另见:opengl.org/wiki/Buffer_Object_Streaming 【参考方案1】:

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

问题是,为每一帧保存一个完整的 VBO 副本会占用大量内存。

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

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

【讨论】:

如果每一帧都有关键帧怎么办?我不完全使用动画数据,更像是延时 FMRI 序列。

以上是关于快速修改 OpenGL VAO 缓冲区的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL - 正确地将 VAO 定义与 VBO 和其他缓冲区创建分开

OpenGL 顶点数组/缓冲区对象

绘图调用期间 Opengl vao 中断

我的OpenGL学习进阶之旅介绍 顶点数组对象VAO并实战一下

带有 GL_DYNAMIC_DRAW 的 OpenGL VAO

OpenGL ES之VBOEBO与VAO的说明和使用