HEngine
  • 引擎编译
  • 未来工作
  • 使用文档
    • 代码规范
    • Shader规范
    • config 配置
  • Python脚本系统
    • 技术分析
    • 使用api
  • Cpp脚本系统
    • 技术分析
  • 技术文档 & 心得体会
    • 数学
      • 坐标系、UV与深度范围
      • 行主序 与 列主序
    • 路径管理
    • 构建系统
    • 自定义资源格式
    • UI
      • undo/redo
      • 分辨率处理
    • ECS 系统
    • 插件系统
    • 数学库
    • Ref Counted
    • 音频
    • ChatGPT
    • Mesh、Vertex 等组织关系
    • 编辑器热更新方案
    • Profile
    • NLP
    • RenderDoc
    • CodeGen与反射系统
    • 安装包
    • 物理引擎
      • PhysX集成
      • Bullet集成
    • 动画
  • 图形后端
    • 坐标系差异
    • Feature差异
    • RHI 封装
    • Shader与Constant Buffer
    • DX12
    • Vulkan
    • Render Graph
    • 渲染整体架构
  • 图形Feature
    • 毛发
    • 鼠标拾取
    • 实例化渲染
  • Shader
    • Shader 交叉编译
    • Shader Toy
    • Shader 热更新
    • PBR
  • 打包
    • 打包
  • Bug 记录 & 解决过程
    • 闪退记录汇总
    • 导入图片显示混乱
    • D3D下glfw+imgui失效
  • 其他资料
    • 总结集合
Powered by GitBook
On this page
  • 贴图
  • 路径
  • 对比
  1. 技术文档 & 心得体会

自定义资源格式

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 。

Previous构建系统NextUI

Last updated 2 years ago