是否有任何直接支持顶点缓冲区对象的建模格式?
目前我的游戏引擎一直在使用Wavefront Models,但我一直在使用立即模式和显示列表。这有效,但我想将整个系统升级到现代OpenGL,包括Shaders。我知道我可以使用立即模式和显示列表与Shaders,但像大多数有抱负的开发人员,我希望我的游戏是最好的。在问上面提到的问题后,我很快意识到Wavefront Models根本不支持Vertex Buffers;这主要是由于模型的索引方式。为了使用顶点缓冲区对象,顶点,纹理坐标和法线数组的长度都必须相等。
我可以通过编写自己的转换器来实现这一点,我已经完成了。本质上,我展开索引并创建关联的数组。我甚至不需要完全使用glDrawElements
,我可以使用glDrawArrays
,我完全可以做到。唯一的问题是我实际上是在复制数据;阵列变得庞大(特别是对于大型模型),这对我来说似乎不对。当然,必须有一种现代的方法,可以在不完全展开索引的情况下将模型初始化为顶点缓冲区。所以我有两个问题。
1。他们的任何现代模型格式/概念是否支持直接顶点缓冲区对象?
2。这已经是行业标准吗?大多数游戏引擎是否在运行时展开索引(并将数组也称为解包),以创建游戏世界资产?
答案 0 :(得分:2)
存储格式的主要问题是空间效率。从存储介质中读取您会受到大量I / O带宽的限制。因此,您可以投资以减少从存储中读取的数据总量的任何CPU周期将极大地有利于资产加载时间。只是为了给你一般的想法。即使是在撰写本文时您目前可以购买的最快的SSD也不会超过5GiB / s(相信我,我尝试采购可以使我的工作的8个PCIe-3通道饱和的东西)。典型的CPU内存带宽至少高出一个数量级。 GPU具有更多的内存带宽。更低级别的缓存更快。
那么我想告诉你的是:那个索引展开了开销?对于您,开发人员而言,这主要是给您带来不便,但可能会在加载资产时节省一些时间。
(建议编辑):当然,在文本表示中存储数字对空间效率没有帮助;取决于基数的选择,单个数字表示3到5位(比如说4位)。然而,相同的文本字符消耗8位,因此您有大约100%的开销。这是以二进制格式存储的最低挂果。
但为何停在那里?如何在数据上应用压缩?有许多压缩资产格式。但是一个特别发达的是OpenCTM,尽管将最近开发的压缩算法之一添加到其中是有意义的。我在这里想Zstandard,它可以很好地压缩数据,同时在解压缩时速度非常快。