【发布时间】:2011-02-25 08:55:26
【问题描述】:
在游戏中存储 3d 模型的最佳方法是什么? 我存储在向量中: 矢量三角形(每个三角形包含 texcords 的数量、顶点的数量和法线的数量), 矢量点; 矢量法线; 矢量texCords;
【问题讨论】:
-
“在游戏中存储 3d 模型?”:您说的是哪一个:内存存储(使用时)还是磁盘存储(游戏安装后)?
在游戏中存储 3d 模型的最佳方法是什么? 我存储在向量中: 矢量三角形(每个三角形包含 texcords 的数量、顶点的数量和法线的数量), 矢量点; 矢量法线; 矢量texCords;
【问题讨论】:
我不确定在这种情况下什么是“最佳方法”,因为这将取决于情况,并且在您的问题中,它在某种程度上可以解释。
如果您正在谈论如何快速渲染静态对象,您可以使用Display Lists 来帮助您。它们可用于memoize 一次所有 OpenGL 调用,然后在游戏中使用时调用这些指令以渲染对象。您为计算顶点位置、法线等而产生的所有开销仅在您构建每个显示列表时执行一次。缺点是,如果您的模型更改过于频繁,您将不会看到太多的性能提升。
编辑:SurvivalMachine 下面提到不推荐使用显示列表。特别是,它们在 OpenGL 3.0 版中已被弃用,并在 3.1 版中完全从标准中删除。经过一番研究,似乎Vertex Buffer Object (VBO) 扩展是首选替代方案,尽管我发现许多消息来源声称性能不如显示列表。
【讨论】:
我选择从 .ms3d 格式导入模型,虽然我以后可能会重构,但我认为它为我的 3D 模型的数据结构提供了良好的基础。
spec(C 标头格式)读起来非常简单;我正在用 Java 编写我的游戏,所以我只是简单地移植了每个数据结构:顶点、三角形、组、材质,以及可选的骨骼动画元素。
但实际上,模型只是三个顶点(或三角形),每个顶点都有一个材质,对吧?首先创建这些基本结构,编写一个绘制函数,将模型作为参数并绘制它,然后根据需要添加您可能需要的任何其他功能。迭代设计,如果你愿意的话。
【讨论】: