支持顶点缓冲区的现代建模格式

Modern Modelling Formats that Support Vertex Buffers

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

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

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

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

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

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

那么我想告诉您的是:索引展开开销?这对您(开发者)来说主要是一种不便,但可能会节省一些加载资产的时间。

(建议编辑):当然,将数字存储在文本表示中不会有助于 space 效率;根据基数的选择,单个数字代表 3 到 5 位(比如说 4 位)。然而,相同的文本字符占用 8 位,因此您在那里有大约 100% 的开销。这是以二进制格式存储的最简单的方法。

但为什么要到此为止呢?如何对数据应用压缩?有许多压缩资产格式。但是 OpenCTM, although it would make some sense to add one of the recently developed compression algorithms to it. I'm thinking of Zstandard 这里有一个特别发达的,它可以很好地压缩数据,同时在解压缩时速度快得令人发指。