Untoon Engine
Priority-and-Fake-Transparency-Validation
本页目录
优先显示验收
当前状态
用户已反馈此前构建编译成功,局部优先显示测试符合预期。移除已取消功能及清理参数残留后的最终版本仍需用户构建验证。代理只执行源码审查和不依赖引擎的 Python 检查,没有编译引擎、Shader、材质或启动编辑器;以下完整场景矩阵与 GPU 性能验收仍待验证。
使用说明见材质编写指南,实现顺序见渲染管线,资源与数据结构见架构说明,调试开关见灯光与后处理指南。
支持范围
| 路径 | 优先显示 |
|---|---|
| 桌面 Deferred 普通静态/骨骼网格,Opaque/Masked Toon | 实现相机深度覆盖 |
| 普通非 Toon 材质 | 保留普通遮挡 |
| Nanite | 保留遮挡,不参与优先组 |
| Groom Strands、Forward、Mobile、Path Tracing | 不参与 |
| Scene Capture、反射捕获、Instanced Stereo | 不参与 |
| 阴影地图、Lumen 场景捕获、光追反射 | 原始几何 |
| Lumen 关闭、缓存关闭、其他 Final Gather | 优先显示仍独立工作 |
屏幕追踪可能间接看到相机可见性与颜色变化。没有新增 Shading Model、GBuffer 编码、CustomDepth 或 CustomStencil 占用;无需迁移旧材质。
已执行的独立检查
测试入口:Engine/Source/Runtime/Renderer/Private/Untoon/Tests/test_visibility_reference.py。
python -B Engine/Source/Runtime/Renderer/Private/Untoon/Tests/test_visibility_reference.py
19 项检查覆盖:
- 同组眼部、多层头发、脸部遮挡、墙体夹在头发与眼部之间、Nanite 墙体的普通遮挡语义。
- 不同组交错、像素遮罩阈值、未登记成员、隐藏目标、逐帧目标消失。
- 图集容量失败及失败组仍遮挡其他组。
- 五个片元的全部 120 种深度排列、不同提交顺序,以及 2,000 组随机遮罩/多角色案例。
- 非零 ViewRect、同组不同视图、不同组同屏幕像素的图集索引隔离。
- LOD stencil 清除后重建相同像素判定,覆盖 raster/compute 路径、非零视图原点与过渡零点。
- 新材质接口序号、未改 GBuffer/Shading Model 定义、上游新增源码行的单层 Untoon 标记。
这些测试使用标量反向深度模拟遮挡,不调用 UE,不包含 GPU 光栅化、遮挡查询、LOD 过渡、Shader、材质编译或 RHI 参数验证。
源码核对项目
- Outline 不再采样同时写入的 SceneColor;硬件混合保留目标 alpha,源像素和自身剔除检查 Untoon Shading Model。
- Shadow Blur 在最终 ShadowMask 后创建 ViewRect 快照,模糊链保持局部范围,合成仅读快照并只写 B。
- ShadowMask 的两处阴影输入都绑定只读快照;Toon Light 的 SceneTexture 颜色输入绑定已完成光照的副本。两条光照 mesh pass 以只读深度绑定,并补齐对应 PSO 的实际目标格式。
- 优先深度 Phase 1 使用空图集,Phase 2 在目标覆盖生产后绑定实际图集;组失败时覆盖为零。
- 完整遮挡包括仅写深度的普通组件与 Nanite。前一帧的 primitive/instance occlusion、预计算可见性和 Nanite HZB 不得丢弃被头发遮住的真实阻挡物。
- 延迟头发深度完成后修正 Nanite shading mask/decal stencil、清除被替换表面的速度,再生成后续 HZB。
- Depth、Base Pass、Velocity、Toon ShadowMask、Toon Light 共用覆盖规则;普通 Opaque 让位材质保留材质像素判断。
- 完整基线在原生预深度清除 LOD stencil 前生成;补绘及 Toon 光照通过每次绘制的参数复现相同过渡判定,不读取已清除的 stencil。LOD 过渡绘制由原生可见性流程禁止缓存。
- 新 mesh pass 的 PSO collector 与实际 blend、depth/stencil、目标格式和材质筛选保持一致。
- 未参与视图不提交优先深度/图集测试 Pass。
待运行:基础回归
- 对比功能关闭时旧 Toon、普通非 Toon、混合材质、Nanite 场景。
- 确认旧材质无需重做连接,Toon Light 的 AreaLightLightingModulate 仍为 Float3,序号和默认值不变。
- 验证普通静态网格、骨骼网格、Masked、Opaque、WPO、PDO、法线贴图和材质实例。
- 检查新节点在传统编译路径与 MIR 下的输入类型、默认值及生成函数。
- D3D/Vulkan 所用目标平台检查 Shader 参数、RHI validation、RDG validation 和 PSO precache 日志。
- 普通与 Nanite Toon ShadowMask/Light 导出、描边和阴影晕染回归。
待运行:优先显示
- 同角色眼睛完整穿过已标记头发;未标记发片保持遮挡。
- 脸部遮眼;墙在头发前方、头发与眼睛之间、眼睛后方三种位置。
- 多角色共享材质但组独立;不同角色头发、脸和眼睛交错。
- 同一网格不同材质槽;跨组件成员;成员移除、重注册、重复登记与运行时 RefreshMembers。
- 隐藏目标、距离裁剪、LOD/dither 过渡、骨骼动画、WPO、PDO、相机切换。
- 遮挡物上一帧完全被头发挡住,本帧仍正确阻挡目标;仅写深度组件仍遮挡。
- Nanite 普通墙体挡眼;补绘头发覆盖 Nanite 后,没有残留 Nanite 着色或速度。
- 降低 MaxAtlasSize 制造容量失败,失败组恢复普通遮挡,其他组不串数据。
- 多 ViewRect、非零原点、分屏、动态分辨率;功能未参与视图没有新增对应 Pass。
- DDM_AllOpaque、DDM_AllOpaqueNoVelocity 和不同 prepass 设置下深度一致。
- TSR/TAA 下头发边缘、眼部、运动向量、历史重投影与描边一致。
- 检查投射阴影、Lumen 场景捕获、光追反射仍保留原始头发几何。
待运行:成本记录
| 场景 | 优先 Pass GPU ms | Toon Light GPU ms | Lumen 更新 GPU ms | Atlas MiB | 临时纹理峰值 MiB |
|---|---|---|---|---|---|
| 功能关闭 | 待测 | 待测 | 待测 | 待测 | 待测 |
| 单角色优先显示 | 待测 | 待测 | 待测 | 待测 | 待测 |
| 多角色优先显示 | 待测 | 待测 | 待测 | 待测 | 待测 |
记录分辨率、RHI、GPU、角色数和材质覆盖面积。优先图集之外的基线快照、逐组临时资源和遮挡剔除成本也须计入。