343 lines
8.2 KiB
Markdown
343 lines
8.2 KiB
Markdown
|
|
# 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”这一段
|
|||
|
|
|
|||
|
|
而不是去碰动画系统。
|