7.0 KiB
7.0 KiB
Nahida Unity式Model导入与Genshin卡通渲染正式化计划
日期:2026-04-11
1. 目标
这一轮不再按“静态拆件预览”推进,而是正式切到更接近 Unity 的方案:
- FBX/OBJ 等外部模型统一作为
Model主资产导入 - 场景侧通过
Model -> GameObject hierarchy实例化恢复节点层级 Mesh继续只负责底层几何与 section/material slot- Nahida 的卡通渲染改为“对齐 Unity 旧工程
Genshin.shader语义”,而不是继续维持近似版 shader
本轮仍然明确不做:
- 骨骼动画
- GPU skinning
SkinnedMeshRenderer运行时- BlendShape
- Animator / AnimationClip 播放系统
2. 当前判断
2.1 Model链路已经具备的能力
代码里已经有以下基础设施:
ResourceType::ModelModel/ModelLoaderxcmodelartifactAssimpModelImporterAssetDatabase中ModelImporter以Model为主资产导入- sub-asset manifest 与
LocalID -> artifact path解析
这说明“Unity式 Model 主资产”不是从零开始,而是缺最后几段关键闭环。
2.2 当前最主要的缺口
真正还没闭环的是:
Model还不能正式实例化成场景层级MeshFilter/MeshRenderer还缺稳定的 sub-assetAssetRef绑定入口- 编辑器侧还没有把模型资产当成“可实例化层级对象”来用
- Nahida 当前
XCCharacterToon.shader不是 Unity 旧工程Genshin.shader的等价移植 - FBX 导入后的静态 mesh 目前丢失了 Unity shader 依赖的顶点语义,尤其是
vertex color与UV1/backUV
2.3 关于当前 shader 的明确结论
当前使用的是:
project/Assets/Shaders/XCCharacterToon.shader
Unity 参考原件是:
docs/reference/NahidaUnity/Shaders/Genshin.shaderdocs/reference/NahidaUnity/Shaders/GenshinInput.hlsldocs/reference/NahidaUnity/Shaders/GenshinForwardPass.hlsldocs/reference/NahidaUnity/Shaders/GenshinOutlinePass.hlsl
当前 shader 只是第一版近似实现,不是原 shader 原样移植。当前效果发怪,核心原因不是简单调参,而是语义缺口:
- 没有按 Unity 的
_IS_FACE / _SPECULAR / _RIM / _NORMAL_MAP / _DOUBLE_SIDED关键字分支工作 - 面部阴影没有按
_FaceDirection + _FaceLightMap + _FaceShadow + _FaceShadowOffset的逻辑算 - 阴影 ramp 还没有按 Unity 的 material ID 分层抽样
- specular 还不是 Unity 那套
lightMap + metalMap + matcap路径 - rim 不是基于 scene depth 的 URP 风格边缘检测
- outline pass 还没有正式接回
Nahida_Body_Smooth.mesh与 outline color 分档逻辑 - Unity 里还有
MaterialUpdater.cs在运行时写_FaceDirection,当前引擎里这条驱动链不存在 - 更关键的是,当前引擎导入出的 Nahida mesh 只有
Position/Normal/Tangent/Bitangent/UV0,缺Color/UV1 - Unity 的
GenshinForwardPass.hlsl明确依赖input.color.r与backUV - 这会直接破坏 body/hair 分支的
aoFactor = lightMap.g * input.color.r与双面材质背面采样,因此“脸基本对、身体和头发大面积偏色”是符合代码现状的结果
所以它现在看起来不像原工程,是正常结果。
3. 本轮正式范围
Phase 1:Model实例化基础链路
目标:
- 把
Model正式实例化为场景GameObject层级
任务:
- 为
MeshFilterComponent增加 mesh sub-assetAssetRef绑定入口 - 为
MeshRendererComponent增加 material sub-assetAssetRef绑定入口 - 保证这些 sub-asset 引用能被场景序列化稳定保存
- 新增
Model -> Scene hierarchy实例化工具 - 恢复节点本地 TRS
- 恢复 mesh binding 与 material slot binding
验收:
- 导入一个
OBJ/FBX Model后,可以在场景里创建出层级对象 - 场景存盘后 sub-asset 引用不丢
- 不需要把 FBX 拆成手工摆放的多个静态对象
Phase 2:编辑器侧 Model使用工作流
目标:
- 让编辑器把
Model当成 Unity 式模型资产使用
任务:
- 增加“从模型资产创建场景对象”的命令入口
- 后续接到 Project/Hierarchy/Viewport 的拖拽放置链路
- 让 Nahida 预览场景切到
Model驱动的实例化路径
验收:
- 编辑器里不再主要依赖“手工往
MeshFilter塞 FBX 路径” - Nahida 预览对象结构来自
Model实例化,而不是手工拆件
Phase 3:Genshin shader 语义对齐
目标:
- 让 Nahida 使用更接近 Unity 旧工程的卡通渲染语义
任务:
- 先补齐静态 mesh 顶点语义链路:
Color、UV1/backUV - 让前向渲染输入布局与
XCCharacterToon.shader能真正接到COLOR与TEXCOORD1 - 恢复 body/hair 分支里的
lightMap.g * input.color.r - 恢复双面材质对
backUV的切换采样 - 按 Unity 原 shader 拆分 forward / outline 两条主路径
- 补
_IS_FACE / _SPECULAR / _RIM / _NORMAL_MAP / _DOUBLE_SIDED语义 - 补 face shadow 正式逻辑
- 补 outline pass 与
Nahida_Body_Smooth.mesh - 视情况补一个轻量
_FaceDirection运行时驱动
验收:
- 角色明暗分层、面部阴影、描边、头发高光接近 Unity 参考
4. 执行顺序
这一轮按下面顺序推进:
- 先补
Model实例化与 sub-asset 引用闭环 - 再把 Nahida 预览场景切到
Model路径 - 再补 FBX 静态 mesh 的
Color/UV1导入、artifact 保存、渲染输入布局与 shader 接线 - 再做 shader 语义对齐
- 最后做画面调参与残余语义收口
不能反过来做。因为当前 shader 再怎么调,只要场景组织和资源绑定语义不对,结果都不稳定。
5. 当前这一刀
这一轮立刻执行的第一刀是:
- 补齐 FBX 静态 mesh 的
vertex color与UV1/backUV导入 - 让
BuiltinForwardPipeline与XCCharacterToon.shader真正吃到COLOR/TEXCOORD1 - 补 Nahida 集成诊断与回归验证,先把 body/hair 的基础色输入纠正
- 在这个基础上继续向 Unity 式
Model -> hierarchy与完整 shader 语义收口推进
这是 Nahida 当前从“基础贴图都不稳定”切回“先保证静态基础颜色正确”的前置条件,也是后续继续 Unity 式正式方案的必要补丁。
6. 2026-04-11 新发现补充
在实际跑 tests/Rendering/integration/nahida_preview_scene 之后,问题又进一步收窄了:
- Nahida 的
Body_Mesh0运行时已经有uv1数值,且当前实现会在缺少第二套 UV 时回填uv1 = uv0 - 但导入器只在
mesh.HasTextureCoords(1)为真时才打VertexAttribute::UV1标记 - 结果就是:数据层面有 fallback
uv1,语义层面却仍被当成“没有 UV1” - 这会导致后续依赖
backUV的 shader / 诊断逻辑继续走错分支
因此当前这一刀的执行重点再精确一步,变成:
- 修复
AssimpModelImporter/MeshLoader中“fallback uv1 已写入但UV1flag 未置位”的不一致 - 提升
ModelImporter版本,强制 Nahida 现有.xcmodelartifact 重导 - 补针对 Nahida FBX 的导入回归测试,确保
UV1fallback 与Color语义不会再次退化 - 再继续跑 Nahida 集成图验证 body/hair 基础色是否进一步收敛