用于动画模型的 OpenGL 即时模式与 VBO

Posted

技术标签:

【中文标题】用于动画模型的 OpenGL 即时模式与 VBO【英文标题】:OpenGL immediate mode vs VBO for animated models 【发布时间】:2012-03-15 19:53:03 【问题描述】:

一些背景信息: 我正在开发一款有趣/体验的 opengl 游戏,并希望有一天能发布一款小型独立游戏。我的 OpenGL 技能仍然非常有限,而且我的知识并没有超出 OpenGL 即时模式和显示列表的范围。

目前我直接在即时模式下渲染我的动画模型(从 ms3d 文件加载后)。对于相当大/复杂的地形,我只能加载和渲染大约 20 个动画模型,这些模型由或多或少 200 个三角形(也包括纹理映射)组成。由于我的一个目标是学习更多关于编程和游戏开发的知识,我觉得学习VBO(顶点缓冲区对象)对我来说很重要,但是作为一名学生,我的时间比较短。我宁愿花时间去实现更多的东西,也不愿学习一些可能很困难的东西(我当然会在下一个假期解决这个问题)。

我的问题:学习 VBO 并将模型加载器和渲染器更改为使用 VBO 而不是立即模式调用是否值得?它会更有效率吗?我正在考虑像 Left4Dead 等游戏,其中可能有许多详细的模型(即使我的目标不是同一个联盟,我也希望得到一些提示,以了解如何改进)。我决定不使用显示列表,因为它必须每帧都重建。这同样不适用于 VBO 吗?

【问题讨论】:

学习顶点数组是值得的,因为即时模式已从 OpenGL-3 中删除,并且在 OpenGL-ES 中从未存在 【参考方案1】:

学习 VBO 并更改模型加载器和渲染器以使用 VBO 而不是立即模式调用是否值得?

VBO 会更有效率。 但是您还可以使用显示列表加速动画,因此您可以跳过 VBO 并使用显示列表。如果您是为了乐趣和自己而编写代码,那么没有理由追逐最新的技术。支持 OpenGL 2 的计算机比支持 OpenGL 4 的计算机多。

无论您使用哪个 OpenGL 版本的着色器,都值得研究 - GLSL 从 OpenGL 2.0 开始就可用,而且非常强大。

无论如何,如果您对使用 OpenGL/着色器感兴趣,您可能需要下载并检查 NVIdia OPenGL SDK。它包含有趣的示例,例如使用顶点着色器和显示列表动画蒙皮模型。

我决定不使用显示列表,因为它必须每帧都重新构建。

如果它们“必须每帧都重建”,那么您就没有正确解决问题(除非您的几何图形是完全动态的并且每帧都改变拓扑)。要么将模型拆分为不需要重建的部分,要么将整个模型放入单个显示列表中并使用顶点着色器为各个部分设置动画。

【讨论】:

我想这是真的。没想到那样(将模型分成几部分)。我认为这几乎回答了我的问题。我也会研究 NVidia OpenGL SDK。谢谢【参考方案2】:

我会建议尝试一下。像 OpenGL 中的大多数其他东西一样,它对我来说看起来也非常令人困惑和害怕,但我只花了 1 天时间就完成了一些示例并弄清楚了如何去做。

很难说它是否会为您提供加速,因为我们不确切知道您要做什么或在什么硬件上,但可以这样想:您可以加载静态数据(如风景,如果它不可变形的话)一次到卡上,不再重新加载它。这意味着您不会每帧都重新发送成百上千个顶点。这通常是一个非常重要的胜利。如果您使用的是 MacOS X,我发现 this page 非常有帮助。即使您不在 OS X 上,它也可能会有所帮助,因为代码示例中没有任何特定于 Mac 的内容。

【讨论】:

谢谢。我已经用显示列表实现了我的静态风景。 GPU 肯定有一个瓶颈,但我不知道使用 VBO 将如何解决这个问题,因为我必须在动画发生后重建模型。我在 Windows 上工作,但无论如何我都会看看那个页面。感谢您的提示。 顺便说一句,那个链接看起来真的很有帮助。再次感谢!【参考方案3】:

与往常一样,技术不断发展。您似乎正在使用 OpenGL2(或更早版本)固定功能架构。现代 OpenGL(最高 4.x)使用​​可编程管道(称为着色器)。您可能需要考虑研究较新的 OpenGL API,它们并不难学(网上有很多东西),而且您可以在模型渲染方面发挥很大的创意。

如果您想继续使用早期版本的 OpenGL,也许您有一些旧硬件,那么一定要了解 VBO。它可能并不总是最好的选择,但它可能是某些几何类型的最佳解决方案。与任何 API 一样,您对它了解得越多,就能更好地利用可用的功能。

【讨论】:

我没有具体理由尝试保留旧版本的 OpenGL。我以前读过着色器,但没有走得太远。我想我应该尽快花一些时间在这上面。使用着色器会消除对 VBO 的需求,还是两者可以一起工作?谢谢。 顺便说一句,您不可能有一个指向介绍级别着色器教程的链接吗?或者知道一个有用的网站?如果没有,不要着急去找,我会自己解决的。 @Denzil 这是一个我觉得很有帮助的教程:lighthouse3d.com/opengl/glsl

以上是关于用于动画模型的 OpenGL 即时模式与 VBO的主要内容,如果未能解决你的问题,请参考以下文章

Opengl:如何对使用顶点数组制作的模型进行纹理处理?

渲染在 OpenGL 中使用 Assimp 加载的动画模型时折叠的网格

使用一次时,显示列表是不是比即时模式更好?

android OpenGL渲染带骨骼动画的3D模型

用于 OpenGL 环境的类似 Flash 的动画编辑和容器格式?

VBO 与即时模式性能