c++ - 如何为大型网格实现 VBO 并获得流畅的动画?

标签 c++ opengl vbo maya

我正在 Maya 中创建一分钟长的动画,我打算在 OpenGL 中渲染它。我这样做是作为大学的一个项目。

该场景仅包含一张做出扭曲表情的人脸。该网格有大约 2200 个四边形面。

我找到了一个将 Wavefront 对象文件转换为顶点和法线数组的 perl 脚本。我打算在 Maya 中以 24fps 制作动画,然后将每一帧中的网格导出到 Wavefront 对象文件,然后通过 perl 脚本运行所有这些文件,这将给我顶点和法线数组。

因此,为了测试可行性,我将 Maya 中的两帧动画转换为对象文件并通过脚本运行它(在调整之后),这给了我数千个 glVertex glNormal 调用。我将所有这些复制到我的 C++ 程序中并编译了它。它运行顺利。

考虑到当我将值(value) 60sec*24frame 的 glVertexglNormal 语句复制到程序中时程序会有多大,我想尝试使用 VBO。所以,我读到了它,但我不太了解它的实现。

所以我的第一个问题是:在这种情况下实现 VBO 的最佳方法是什么?

我正在考虑用于顶点和法线的二维数组,每一帧一个;和 GL_STATIC_DRAW_ARB 用于 glBufferDataARB() 的“用法”参数。

比如说,如果我的动画有 5 帧长,我的面部网格由 2200 个顶点和法线组成,那么我将创建:

GLfloat face_vertices[5][2200] = {.....};
GLfloat face_normals[5][2200] = {.....};

我的第二个问题:上述代码是否可以与 VBO 一起工作或表现“良好”?

此外,我不确定此信息是否重要,但我的计算机在 Intel 82945G 显卡上运行,而且我很确定我大学的 PC 也在 Intel 上运行。只是想我会提到这一点。

更新

性能也是一个问题。

最佳答案

I'm thinking of 2D arrays for both vertices and normals, one for every frame; and

我认为这是不正确的解决方案。有了这么多的数据,流式传输就有意义了。例如,在内存中保留 1 秒的动画,按需加载其余部分。我相信这个场景有 GL_STREAM_**** 标志。

更好的解决方案是从 Maya 中导出骨骼及其动画。 (在这种情况下,您需要一个永远不会改变的网格)

必须导出逐帧逐顶点动画的唯一情况是导出计算成本高得离谱的东西。我能想到的唯一现实场景是 3D 流体网格(拓扑改变帧等)——其他一切都可以在 CPU 或 GPU 上计算。但是,您的帖子并不表示这是您的情况。因此,根据墨菲定律,我必须假设您使用低效解决方案来解决可以不同方式解决的问题。

: Will the above code work or perform "well" with VBOs?

无法回答,因为你没有说你将如何绘制数据。通过滥用着色器、alpha 混合或多次渲染相同的东西,即使是简单的几何体也可能使任何机器瘫痪。

关于c++ - 如何为大型网格实现 VBO 并获得流畅的动画?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10217141/

相关文章:

c++ - 删除指针时崩溃

opengl - VBO 与立即模式性能

c++ - 由于某种原因,OpenGL VAO 指向地址 0

c++ - 如何在Xcode项目中使用dlib face_recognition?

c++ - 在 double 列表中找到最大的数字,需要关心精度吗?

C++ OpenGL 绘制像素

c++ - 启用深度测试时,OpenGL 不会丢弃我的片段

c++ - 用于渲染不同对象的 VAO 和 VBO

opengl - 具有多种纹理的 VBO

c++ - 在多线程中使用 DLL 函数指针