自定义资源格式
MeshComponent 中包含 .hmesh.json 的路径(用于序列化反序列化),以及一个 Mesh 类(用于渲染)。
反序列化的时候,我们从 .hmesh 文件中拿到 MeshRes 格式(参考gltf 2.0),从里面的 primitives 数组找到每个 SubMesh 的具体属性以及对应的材质路径( .hmat.json 的路径),然后对应反序列化出来材质的属性(具体的材质类,图片直接保存 Ref<Texture> 就好了,资源格式只是记录了对应的位置罢了)。
具体的类,Mesh中有SubMesh数组,Material我们用一个哈希表存一个全局的?(思考)然后 Mesh 直接对过去,key直接放 .hmat.json 的相对路径,SubMesh中再存这个路径用于查到对应的具体材质。
贴图
贴图资源按理应该也走导入才对,导入成一份贴图资源和一份描述文件(TextureRes类型来描述),但是我嫌贴图导入太麻烦了,于是我选择把 TextureRes 封在材质里。这样的弊端是,TextureRes里面还会有贴图的采样信息,这样保存在材质里多个材质引用这个贴图采样都是一样的会保存多份,但是好处是不同材质都可以自定义对贴图的采样方式了。
路径
所有的路径都使用相对路径,于是反序列化解析的时候就需要获取绝对路径即可。
对比
ue采用路径作为索引,相应的弊端是所有路径上的更改必须在编辑器下进行,这样才能通过ue的editor去更改对应uasset的路径,从而最终可以正确加载。
unity采用uuid作为索引,每次打开editor会遍历解析所有资源的uuid存起来,这样的好处是我们可以线下(不启动编辑器,直接在本地)更改资源的.meta和资源本身的路径。
我们既想方便直观地使用路径作为索引,又不想只能通过editor才能修改路径。为此我打算如下取舍:
原始资源格式不变,例如 .fbx .obj .gltf ... 这样一个 MeshComponent 中直接保管模型的资源格式,也可以更改路径,只需要再重新赋给对应模型即可;而为了兼顾效率,最终打包的时候再打成自定义资源格式(.hmesh)。如果加载importer插件则也可以直接导入成 hmesh 格式并赋给一个 MeshComponent 。
Last updated