【问题标题】:Store 3d models in game, the best way在游戏中存储 3d 模型,最好的方法
【发布时间】:2011-02-25 08:55:26
【问题描述】:

在游戏中存储 3d 模型的最佳方法是什么? 我存储在向量中: 矢量三角形(每个三角形包含 texcords 的数量、顶点的数量和法线的数量), 矢量点; 矢量法线; 矢量texCords;

【问题讨论】:

  • “在游戏中存储 3d 模型?”:您说的是哪一个:内存存储(使用时)还是磁盘存储(游戏安装后)?
  • 最好的方法完全取决于你的游戏。如果您当前的格式适用于您的游戏,那就去吧。如果您谈论的是文件格式,那么您可以使用一些标准格式,例如提到的一些herehere

标签: opengl 3d


【解决方案1】:

我不确定在这种情况下什么是“最佳方法”,因为这将取决于情况,并且在您的问题中,它在某种程度上可以解释。

如果您正在谈论如何快速渲染静态对象,您可以使用Display Lists 来帮助您。它们可用于memoize 一次所有 OpenGL 调用,然后在游戏中使用时调用这些指令以渲染对象。您为计算顶点位置、法线等而产生的所有开销仅在您构建每个显示列表时执行一次。缺点是,如果您的模型更改过于频繁,您将不会看到太多的性能提升。

编辑:SurvivalMachine 下面提到不推荐使用显示列表。特别是,它们在 OpenGL 3.0 版中已被弃用,并在 3.1 版中完全从标准中删除。经过一番研究,似乎Vertex Buffer Object (VBO) 扩展是首选替代方案,尽管我发现许多消息来源声称性能不如显示列表。

【讨论】:

  • 显示列表已弃用。
  • @SurvivalMachine:我不知道。我已经有一段时间没有进行任何 grpahics 编程了。感谢您的提醒;我已经更新了我的答案。
  • 在我看来,与显示列表相比,VBO 的性能确实取决于显卡。我也进行了一些搜索,并且几次讨论已经有好几年了,并且表明当时的“新”卡开始看到 VBO 的性能比 DL 更高。在任何情况下,显示列表的弃用是(IMO)远离它们的充分理由,更不用说 DirectX 中没有显示列表的等价物,所以如果你想抽象你的引擎以允许 DirectX 支持你将不得不移动到顶点数组或 VBO。
【解决方案2】:

我选择从 .ms3d 格式导入模型,虽然我以后可能会重构,但我认为它为我的 3D 模型的数据结构提供了良好的基础。

spec(C 标头格式)读起来非常简单;我正在用 Java 编写我的游戏,所以我只是简单地移植了每个数据结构:顶点、三角形、组、材质,以及可选的骨骼动画元素。

但实际上,模型只是三个顶点(或三角形),每个顶点都有一个材质,对吧?首先创建这些基本结构,编写一个绘制函数,将模型作为参数并绘制它,然后根据需要添加您可能需要的任何其他功能。迭代设计,如果你愿意的话。

【讨论】:

  • 现在我将三角形存储在 std::vector 上,但它的工作速度非常慢:/ 我必须存储在 std::vector 上,因为我检查与它们的碰撞,有没有比矢量更好的方法?
  • 我会使用常规数组。 std::vector 将有开销,因为它用于保存经常更改的数据结构;但是由于您只是加载数据一次,并且您应该能够确切地知道(或弄清楚)需要存储多少个三角形,因此您不需要向量的额外功能。如果您真的想要,您可以加载到向量中,然后在加载后将其复制到数组中。无论如何,循环遍历数组可能会给您提供所需的额外速度。
  • 还要确保你做的碰撞比每帧检查所有三角形的碰撞更有效。你应该做一些更高级的事情,比如边界框检查,甚至是大场景中的四叉树/八叉树,只有当这些测试为真时,你才应该深入研究只有碰撞网格的三角形。
猜你喜欢
  • 1970-01-01
  • 2010-12-02
  • 1970-01-01
  • 1970-01-01
  • 2012-02-26
  • 1970-01-01
  • 2015-06-11
  • 2011-11-21
  • 2015-02-18
相关资源
最近更新 更多