8.2 KiB
Nahida Unity工程静态卡通渲染迁移计划
日期: 2026-04-10 状态: 已按“仅静态卡通渲染”范围重写
1. 范围锁定
这份计划只服务一个目标:
- 把 Nahida 的静态卡通渲染效果迁到 XCEngine。
本轮明确不做:
- 骨骼动画
- 运行时 skinning
SkinnedMeshRenderer运行链路- blend shape 驱动
- Animator / Humanoid / Retargeting
- Unity 动画系统还原
如果后面发现 Unity 原样例里某些视觉细节依赖骨骼或 blend shape,本轮处理原则是:
- 先接受静态近似
- 不为此把范围扩成动画系统
2. 当前目标
本轮要落地的是一套“静态可渲染”的 Nahida 角色效果,重点是:
- body / hair / face / brow / dress 的分材质关系
- toon 明暗分层
- face shadow 基本成立
- outline 基本成立
- 在独立预览场景里稳定对比和调试
换句话说,本轮不是“把 Unity 角色系统搬过来”,而是:
- 先把 Nahida 的静态画面效果在你自己的引擎里立住
3. 已知事实
3.1 资源基线已经整理
当前已经完成的 Phase 0 资源整备:
- 引擎项目内静态资源基线:
project/Assets/Characters/Nahida/
- Unity 原始参考快照:
docs/reference/NahidaUnity/
已落地的关键资源包括:
- Nahida 的
FBX - body / hair / face / shared 贴图集
Nahida_Body_Smooth.mesh- Unity 材质、shader、scene、脚本参考文件
3.2 当前运行时能力
当前引擎已经具备:
MeshFilterComponent + MeshRendererComponent静态网格渲染路径MeshRendererComponent的多材质槽能力Material/Shader资源导入体系
当前引擎没有现成闭环:
- skinning
- skeleton runtime
- blend shape runtime
所以当前正确路线不是补动画,而是:
- 先基于现有静态渲染路径做 Nahida 的静态效果落地
3.3 Nahida 的 Unity 语义里哪些需要保留
从 Unity 原工程看,本轮静态渲染仍然必须保留这些语义:
- 7 份材质的分工关系
_LightMap驱动的 toon 阴影分层_FaceLightMap + _FaceShadow + _FaceDirection的面部阴影语义_MetalMap、rim、outline 的材质逻辑Nahida_Body_Smooth.mesh对描边效果的贡献
3.4 哪些 Unity 语义本轮只记录、不实现
本轮只作为参考保留,不进入当前执行范围:
SkinnedMeshRenderer- blend shape 默认值
- 头骨驱动的面部朝向更新
- 完整 URP 后处理还原
4. 迁移原则
4.1 先静态成立,再谈角色系统
当前第一优先级是:
- 让 Nahida 在静态场景里正确显示
不是:
- 先做角色运行时架构大一统
4.2 先复用现有静态网格路径
只要当前导入出来的 Nahida mesh / section / material slot 足够支撑静态装配,就优先用现有:
MeshFilterComponentMeshRendererComponent
不额外引入:
ModelComponentSkinnedMeshRendererComponent
4.3 Unity 文件继续只做参考
docs/reference/NahidaUnity/ 里的 .mat、.shader、.unity 继续只作为语义来源。
最终落地仍然必须是:
- 引擎自己的
Shader - 引擎自己的
Material - 引擎自己的
Scene
4.4 面部朝向先做静态近似
本轮不做基于头骨的 _FaceDirection 驱动。
优先级改为:
- 先给面部材质写一个可接受的静态
_FaceDirection - 如果后面确实需要,再加一个基于对象整体朝向的简化驱动
不进入本轮的:
- 基于 head bone 的动态朝向更新
5. 分阶段方案
Phase 0: 资源整备
状态:
- 已完成
已完成内容:
- 建立
project/Assets/Characters/Nahida/资源树 - 补齐缺失贴图
- 补齐
Nahida_Body_Smooth.mesh - 建立
docs/reference/NahidaUnity/参考区 - 写出资源说明与依赖映射
Phase 1: 静态装配基线
目标:
- 确认当前 Nahida 的 FBX 导入产物能否直接支撑静态场景装配
- 建立一个专门用于调试 Nahida 的静态预览场景
任务:
- 盘点 Nahida 当前导入出来的 mesh / submesh / material slot
- 确认应该使用哪些 meshRef 来组装静态角色
- 创建
NahidaPreview.xc - 在场景中放入 Nahida 的静态实例
- 先用占位或默认材质把所有 slot 挂齐
验收:
- Nahida 能在独立场景中稳定显示
- mesh slot 拆分关系清楚
- 预览场景不依赖主场景的历史脏数据
Phase 2: Toon Shader移植
目标:
- 在 XCEngine 里建立 Nahida 用的引擎原生 toon shader
任务:
- 新建 Nahida toon shader
- 先移植最关键的静态视觉能力:
- base map
- base color
_LightMap_FaceLightMap_FaceShadow_MetalMap- rim
- outline
- 不依赖 Unity URP include
验收:
- body / hair / face / dress 的 toon 分层开始成立
- 面部和头发不再是默认 PBR 外观
Phase 3: 引擎原生材质落地
目标:
- 建立 Nahida 的引擎原生材质资产
任务:
- 建立:
Nahida_Base.materialNahida_Body.materialNahida_Hair.materialNahida_Face.materialNahida_Brow.materialNahida_Dress1.materialNahida_Dress2.material
- 按依赖图绑定贴图和参数
- 把材质正式挂到静态预览场景
验收:
- 7 份材质语义清楚
- 各 slot 的贴图和参数不串位
- 删除 Unity 参考
.mat后不影响引擎内显示
Phase 4: 描边与面部阴影补全
目标:
- 把最关键的卡通识别特征补完整
任务:
- 接入
Nahida_Body_Smooth.mesh或等价静态描边路径 - 补全 outline 参数
- 给 face 材质写静态
_FaceDirection - 如确有必要,增加基于角色整体朝向的简化
_FaceDirection驱动
验收:
- outline 视觉成立
- face shadow 不明显错误
- 不引入骨骼依赖
Phase 5: 预览场景与视觉调优
目标:
- 做一个可稳定对照 Unity 的静态 Nahida 预览场景
任务:
- 固定相机
- 固定主光
- 简化背景
- 对 body / hair / face / outline 做迭代调参
- 如确有必要,再补最小后处理
验收:
- 可以稳定截图对比
- 能快速判断问题属于材质、shader、描边还是灯光
6. 风险点
6.1 静态路线与 Unity 原样不会完全一致
因为本轮不做:
- skinning
- blend shape
- head bone 驱动
所以最终效果可以接近,但不保证和 Unity 样例逐像素一致。
6.2 描边依赖特殊 mesh
如果忽略 Nahida_Body_Smooth.mesh,outline 很可能明显跑偏。
6.3 Face shadow 不是纯贴图问题
即使不做骨骼,_FaceDirection 也至少要给一个合理静态值,否则面部阴影会别扭。
6.4 不应该一上来做后处理
如果在 shader、材质、outline 还没立住前就先做 bloom / tonemap,会把问题源混在一起。
7. 验收标准
档位A:静态资源正确
project/Assets/Characters/Nahida/资源完整docs/reference/NahidaUnity/参考区完整- 预览场景可稳定打开
档位B:静态角色正确
- Nahida 静态显示成立
- body / hair / face / brow / dress 分材质正确
- toon 阴影、outline、face shadow 基本成立
档位C:视觉接近样例
- 角色整体风格接近 Unity 样例
- 关键差异只剩高级细节,而不是基础渲染错误
8. 推荐执行顺序
- 先确认 Nahida 当前导入产物的静态装配方式
- 再做引擎原生 toon shader
- 再做 7 份引擎原生材质
- 再补 outline 和 face shadow
- 最后做预览场景调优与可选后处理
明确不要做成:
- 先补 skinning
- 先补动画系统
- 先补骨骼驱动组件
这不在当前范围内。
9. 下一步
基于当前状态,下一步不是继续做计划,也不是做骨骼运行时,而是:
- 先确认 Nahida 当前导入出来的静态 mesh / section / material slot 布局是否足够支撑静态装配。
- 如果足够,直接开始建立
NahidaPreview.xc、引擎原生 toon shader、以及 Nahida 的材质壳子。
当前代码现状对这个判断是偏乐观的:
- 现有渲染路径已经支持
MeshFilter + MeshRenderer MeshRendererComponent已经支持多材质槽- Nahida 当前导入产物里已经存在大量静态 mesh 子资源
所以最合理的下一执行切口是:
- 直接进入“静态预览场景 + toon shader + native materials”这一段
而不是去碰动画系统。