Orbit 角色着色结构:共享材质、参考实例与渲染管线

Orbit 在 UE 原生渲染流程上实现了可复用的角色着色框架,再用参考角色验证材质和纹理配置。通用能力属于 Orbit,针对千夏、Cici 和佩丽卡的适配内容按参考来源归属。

本文以 2026 年 10 月 10 日的工程代码、渲染配置及 139 个角色资产的原生引用审核为依据。“当前位置”是已经存在的结构;“整理方案”已经采用,尚未执行迁移。参数和最新实现以工程为准。

从角色的外观理解文件

看到一个角色时,模型决定几何形状,动画使骨骼和表情变化,材质描述表面如何显色、反光或透明,灯光及后处理参与形成最后的画面。

材质编辑器里的节点执行计算,连线传递结果。材质函数把一组可复用的节点组织起来;材质实例选择已有材质,再调整贴图、颜色、开关和其他参数。UE Substrate 材质概览。

几个常见前缀可用于辨认文件:

前缀 文件类型 例子
M_ 材质,组织完整的表面或后处理计算 M_Character_Soft
MF_ 材质函数,保存可复用的计算块 MF_CharacterFace
MI_ 材质实例,保存具体对象的配置 佩丽卡某个部位的研究实例
TP_ Toon Profile,配置明暗及高光响应 TP_Soft
T_ 贴图或纹理数组,提供采样数据 T_WhiteMatcapArray

Toon Profile 是 UE 原生 Toon BSDF 使用的外观配置。UE 5.8 Toon 节点接口。

运行时的 MID 是动态材质实例,用来更新实时参数;保存到 Content 的 MI_* 是可编辑资产。

共享框架的十九个资产

这些资产目前都位于 Content/Orbit/Characters/Shading,直接依赖中没有 Reference 内容,可以继续作为项目通用角色着色能力。

分组 文件 职责
Functions,3 项 MF_CharacterSurface、MF_CharacterFace、MF_CharacterHair 组织表面、脸部及头发相关的通用计算
Materials,3 项 M_Character_Graphic、M_Character_Illustrated、M_Character_Soft 三套可配置的主要外观风格
Materials,5 项 M_CharacterDetail、M_CharacterFace、M_CharacterHairColor、M_CharacterHidden、M_CharacterOutline 细节、脸部、彩色头发高光、隐藏层和描边用途
Profiles,7 项 Graphic、Illustrated、Soft 的表面/头发 Profile,以及 TP_HairColor 用 UE 配置控制明暗与高光响应
Textures,1 项 T_WhiteMatcapArray 通用默认 Matcap 采样数据

Matcap 是按视线与表面法线计算采样位置的纹理表达方式,可以提供绘制的高光或颜色响应。白色默认数组给材质提供中性的输入;具体参考角色需要的采样数据由其适配实例配置。

高光优先由 UE Profile 曲线和材质参数配置。第一方源模型负责几何、UV 与需要的贴图,最终着色在 UE 中维护。

九十一项角色适配为何跟 Reference 走

当前 Shading/Study 有 92 项:90 个材质实例、一个佩丽卡专属 Profile、一个实验地面材质。

研究对象 内容 原生审核确认的来源
千夏 12 个实例:4 组配置 × 3 种风格 Reference/ZenlessZoneZero 的纹理
Cici / Hayakawa 45 个实例:15 个部位 × 3 种风格 Reference/CiciToon 的纹理
佩丽卡 33 个实例:11 个部位 × 3 种风格;另有 TP_PerlicaHair Reference/Endfield 的纹理
实验地面 M_StudyFloor 供 L_CharacterShadingLab 使用

数量来自不同材质槽和三套外观配置。90 个实例均被着色实验关卡引用;专属头发 Profile 被三个佩丽卡头发实例引用。

通用材质提供计算,角色实例提供贴图及参数,网格的材质槽决定使用哪个实例。例如一个佩丽卡研究实例可以同时引用 Orbit 的通用材质和 Endfield 的研究纹理。

1
2
3
Orbit 通用材质与函数
↑ 由角色实例选择、配置
Reference 的模型和贴图 → 角色适配实例 → 实验关卡中的角色

因此,把适配实例按来源整理,仍然可以共用 Orbit 的着色框架。

C++ 和编辑器工具分别做什么

文件位置 职责
Source/orbit/Private/Player/Characters/CharacterShadingComponent.* 更新主光方向、头部坐标、动态材质参数,以及辅助网格各 LOD 的可见材质槽
Source/orbit/Private/Player/Characters/MaterialExpressionCharacterToon.* 扩展 UE 原生 Toon 材质节点的编译,补齐方向性高光需要的切线基底
Source/orbitEditor/Private/Player/Characters/CharacterShadingAuthoringLibrary.* 编辑器中设置材质实例的 Toon Profile,补充 Python 未直接开放的接口

CharacterShadingComponent 读取角色的头骨朝向和主光,将参数传给材质。附加头发高光层还需要正确的网格、姿势同步及材质槽可见性配置。骨骼动画的职责见Motion Matching 结构。

自定义 Character Toon BSDF 节点最终仍调用 UE 的 Substrate Toon 编译能力。当前标准材质编译路径补齐了切线信息,MIR 分支尚未实现同等支持。

之前搭建的渲染管线在哪里

可以沿一帧的生成过程理解这些内容:

1
2
3
4
5
6
7
动画更新骨骼姿势与表情
→ 网格蒙皮与形变
→ 深度和阴影绘制
→ 材质、Substrate 表面数据与灯光计算
→ 按材质设置进行透明和高光层合成
→ 描边、景深及其他后处理
→ 最终画面

这是理解职责的流程示意。具体渲染阶段、并行关系和合成顺序应以引擎配置及实际 GPU 捕获为准。

部分 当前落地位置
深度、阴影、光照和透明等底层渲染执行 UE 原生渲染器
Substrate、Adaptive GBuffer、Custom Depth/Stencil、Sorted Pixels OIT 等项目选择 Config/DefaultEngine.ini
项目可复用角色着色能力 Orbit 的 C++ 扩展和 Characters/Shading 共享资产
参考角色的模型、贴图及适配配置 对应来源的 Reference 内容
用来观察和比较效果的场景 Maps/Tests/L_CharacterShadingLab

Orbit 当前实现的是角色着色框架及材质节点扩展。渲染工作由 UE 执行,项目配置和内容决定这些能力怎样用于角色;参考角色用来提供可追溯的对照案例。

当前位置与已采用的整理方案

19 个共享资产保留原有分组:

1
2
3
4
5
Content/Orbit/Characters/Shading/
├── Functions/
├── Materials/
├── Profiles/
└── Textures/

91 项角色适配的目标位置按来源分开:

1
2
3
4
Content/Reference/
├── ZenlessZoneZero/CharacterShading/ # 千夏的 12 个实例
├── CiciToon/CharacterShading/ # Cici 的 45 个实例
└── Endfield/CharacterShading/ # 佩丽卡的 33 个实例及专属 Profile

实验地面材质随着色实验关卡组织。原装素材继续保留;这些整理只改变配置资产的位置与引用。

怎样阅读与验证

先打开 L_CharacterShadingLab,选中角色,找到网格的 Materials,打开一个 MI_*。查看它选择了哪个父材质、哪些贴图和 Profile,再沿父材质进入 MF_*,最后检查角色着色组件里的主光、头骨与附加网格配置。

验证时需要分别检查 Shader 编译、引用和实际画面。脸部阴影应随头部与主光变化;发束高光、透明边缘、描边及正常投影需要固定机位对照。研究纹理的通道和色彩空间以来源证据为准。

本轮引用审核确认了共享框架与研究适配的边界,没有重新完成所有动态画面和 GPU 性能验收。现有工程文档仍记录 OIT 空透明批次的渲染图校验问题;MIR 支持、完整原作光照及景深效果恢复也仍有边界。后续优化应以对应检查和真实画面对照确认。