Files
XCEngine/docs/used/Nahida Unity工程迁移与卡通角色渲染落地计划_完成归档_2026-04-11.md

343 lines
8.2 KiB
Markdown
Raw Normal View History

# 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 足够支撑静态装配,就优先用现有:
- `MeshFilterComponent`
- `MeshRendererComponent`
不额外引入:
- `ModelComponent`
- `SkinnedMeshRendererComponent`
### 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.material`
- `Nahida_Body.material`
- `Nahida_Hair.material`
- `Nahida_Face.material`
- `Nahida_Brow.material`
- `Nahida_Dress1.material`
- `Nahida_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. 推荐执行顺序
1. 先确认 Nahida 当前导入产物的静态装配方式
2. 再做引擎原生 toon shader
3. 再做 7 份引擎原生材质
4. 再补 outline 和 face shadow
5. 最后做预览场景调优与可选后处理
明确不要做成:
1. 先补 skinning
2. 先补动画系统
3. 先补骨骼驱动组件
这不在当前范围内。
## 9. 下一步
基于当前状态,下一步不是继续做计划,也不是做骨骼运行时,而是:
1. 先确认 Nahida 当前导入出来的静态 mesh / section / material slot 布局是否足够支撑静态装配。
2. 如果足够,直接开始建立 `NahidaPreview.xc`、引擎原生 toon shader、以及 Nahida 的材质壳子。
当前代码现状对这个判断是偏乐观的:
- 现有渲染路径已经支持 `MeshFilter + MeshRenderer`
- `MeshRendererComponent` 已经支持多材质槽
- Nahida 当前导入产物里已经存在大量静态 mesh 子资源
所以最合理的下一执行切口是:
- 直接进入“静态预览场景 + toon shader + native materials”这一段
而不是去碰动画系统。