-1

是否有任何直接支持顶点缓冲区对象的建模格式?

目前我的游戏引擎一直在使用Wavefront Models,但我一直将它们与即时模式和显示列表一起使用。这可行,但我想将我的整个系统升级到现代 OpenGL,包括着色器。我知道我可以使用即时模式并通过着色器显示列表,但像大多数有抱负的开发人员一样,我希望我的游戏能够做到最好。在问了上面链接的问题后,我很快意识到 Wavefront 模型根本不支持顶点缓冲区。这主要是由于模型的索引方式。为了使用顶点缓冲区对象,顶点、纹理坐标和法线数组都需要长度相等。

我可以通过编写自己的转换器来实现这一点,我已经这样做了。本质上,我展开索引并创建关联的数组。我什至不需要完全使用glDrawElements,我可以使用glDrawArrays,我做得很好。唯一的问题是我实际上是在复制数据;阵列变得庞大(尤其是大型模型),这对我来说似乎是错误的。当然,必须有一种现代方法将模型初始化为顶点缓冲区,而无需完全展开索引。所以我有两个问题。

1. 他们是否有任何支持直接顶点缓冲区对象的现代模型格式/概念?

2. 这已经是行业标准了吗?大多数游戏引擎是否在运行时展开索引(并膨胀数组,也称为解包)以创建游戏世界资产?

4

1 回答 1

2

存储格式的主要关注点是空间效率。从存储介质中读取数据会受到 I/O 带宽的很大限制。因此,您可以投入任何 CPU 周期来减少从存储中读取的数据总量,这将极大地提高资产加载时间。只是给你一个大致的想法。即使在撰写本文时您目前可以购买的最快的 SSD 也不会超过 5GiB/s(相信我,我尝试为我的工作采购可以使 PCIe-3 的 8 通道饱和的东西)。您的典型 CPU 内存带宽至少要高出一个数量级。GPU 拥有更多的内存带宽。更快的是较低级别的缓存。

所以我想告诉你的是:那个索引展开开销?对于开发人员来说,这主要是一种不便,但可能会节省一些加载资产的时间。

(建议编辑):当然,以文本表示形式存储数字不会有助于提高空间效率;根据基数的选择,单个数字代表 3 到 5 位(比如说 4 位)。然而,相同的文本字符消耗 8 位,因此您有大约 100% 的开销。这是以二进制格式存储的最容易实现的目标。

但为什么要停在那里?如何对数据应用压缩?有许多压缩资产格式。但是一个特别发达的算法是OpenCTM,尽管在其中添加一种最近开发的压缩算法会很有意义。我在这里想到了Zstandard,它可以很好地压缩数据,同时在解压缩时速度非常快。

于 2017-06-16T20:23:13.790 回答