Untoon Engine

Lighting-and-Post-Process-Guide

本页目录

灯光与后处理指南

目标

这一页讲 untoon 的 Untoon 灯光参数和场景级 Untoon 控制项怎么用。

优先显示调试

新功能沿用当前 Toon 光照。优先目标仍获得正常光照、高光、速度和描边;只是本组指定头发不再覆盖有效目标。投射阴影和光追几何保持原样,所以眼部仍可能收到头发投射的阴影,应通过既有 Toon 阴影控制调节风格。

Console Variable 默认值 用途
r.Untoon.Priority 1 全局允许优先显示;材质节点和组登记仍需显式配置
r.Untoon.Priority.Debug 0 0 正常、1 组颜色、2 有效目标覆盖(绿色)
r.Untoon.Priority.MaxAtlasSize 4096 图集最大边长;放不下的组恢复普通遮挡

Priority 调试覆盖显示作用于有组记录的可见 Toon 像素。

GPU 测量应记录关闭功能、单角色、多角色时的 Untoon.Priority.* 与 Toon Light 时间。优先显示会减少启用视图的历史遮挡剔除,目前没有已验证的性能收益结论。

灯光侧 Untoon 参数

该分支为 Light Component 增加了 Light|Toon 分类。常用参数包括:

  • Enable Default Lighting
  • Default Lighting Intensity
  • Enable Toon Base Lighting
  • Untoon Base Lighting Intensity
  • Untoon Light Smooth
  • Untoon Light Offset
  • Enable Toon Rim Lighting
  • Untoon Rim Lighting Intensity
  • Rim Color
  • Rim Fadeout
  • Screen Space Rim Width
  • Screen Space Rim Threshold
  • Screen Space Rim Contribute
  • Fresnel Rim Contribute
  • Fresnel Rim Exponent
  • Penumbra Tint Mode
  • Penumbra Color

上面写的是编辑器里的显示名。Enable * 开关、Screen Space Rim * 和 Fresnel Rim Exponent 显式设置了显示名,其余由 C++ 属性名自动生成,例如 UntoonLightSmooth 显示为 Untoon Light Smooth。

局部光(点光 / 聚光 / 矩形光)在启用 Enable Toon Base Lighting 后还提供 Untoon Light Flatten 与 Flatten Distance,用于让明暗形状更接近光源的距离衰减。方向光没有衰减半径,不支持这两个参数,渲染时始终按 0 处理。

推荐调参顺序

关键灯按这个顺序调:

  1. 决定是否保留默认光照
  2. 调整 Toon Base Lighting 强度
  3. 调整 Untoon Light Smooth
  4. 调整 Untoon Light Offset
  5. 再引入 Rim Lighting
  6. 最后处理 Penumbra Tint

参数语义建议

Default Lighting

项目里非 Untoon 材质还要继续吃 UE 默认光照时,保持启用。

如果这盏灯只用来给 Untoon 角色塑形,可以把默认光照压低甚至关掉。

Toon Base Lighting

这一组参数控制 Untoon 受光的主要明暗结构:Intensity 决定整体强度,Smooth 决定明暗边界软硬,Offset 决定明暗分界线的位置。

RenderLights 阶段生成的主受光 / 表面阴影结果会继续流入后续 ToonShadowMask 和 ToonLight 阶段,所以灯光参数不只影响直接受光,也会改变风格化阴影和最终合成。

Rim Lighting

逆光,或者角色轮廓糊进背景时,用 Rim Light 把边缘提出来。

Penumbra Tint

阴影过渡区发灰、发脏时,用 Penumbra Tint 给过渡带加风格色。

与 Untoon 渲染阶段的关系

Untoon 灯光相关的阶段顺序:

  1. RenderLights 生成主受光结果,并写入 UntoonShadow.R
  2. RenderToonShadowMask 重新评估材质 ToonShadowMaskOutput,写入 UntoonShadow.G/A
  3. RenderToonLightPass 准备 light 参数时触发 AddToonMainLightShadowBlurPass,基于 G/A 生成晕染后的光照遮罩并写入 UntoonShadow.B
  4. RenderToonLightPass 重新评估材质 ToonLightOutput,合成回 SceneColor

因此:

  • 灯光参数既影响 RenderLights,也会影响后续 LightPassLight 上下文
  • ToonShadowMask 和 Toon Light 材质节点看到的主光参数需要与普通 mesh / Nanite 保持一致
  • 调光时如果发现普通 mesh 与 Nanite 表现不同,应优先检查 post-light export 是否复用了相同的 LightPassLight 语义

当前 Toon Light 阶段的关键理解是:

  • PreLightSceneColor:灯光前的 SceneColor 快照
  • PostLightSceneColor:灯光后的 SceneColor 快照
  • AreaLightLighting = max(PostLightSceneColor - PreLightSceneColor, 0):当前后置阶段看到的区域光照差分结果
  • SimpleMainDirectionalDiffuse:随 ToonLighting.a 增大而减弱的主方向光简化漫反射补偿

材质可以通过 Toon Light 的第二个输出 AreaLightLightingModulate 调制这部分差分结果;普通 mesh 与 Nanite 当前都使用同一套合成公式:

AreaLightLighting *= AreaLightLightingModulate;
SimpleMainDirectionalDiffuse = (BaseColor / PI) * MainLightColor * saturate(dot(N, L)) * (1.0 - UntoonShadow.R);
FinalColor = lerp(PostLightSceneColor + SimpleMainDirectionalDiffuse, ToonLighting.rgb + AreaLightLighting, saturate(ToonLighting.a));

可缩放 Untoon 质量

高开销的 Untoon Shadow Blur 和 Untoon Outline 阶段支持运行时质量档位:

  • r.Untoon.ShadingQuality:全局默认质量,0 关闭可选高开销效果,1 低,2 中,3 高;默认 3
  • r.Untoon.ShadowBlur.ShadingQuality:主光 Shadow Blur 覆盖项,默认 -1 表示继承全局质量
  • r.Untoon.Outline.ShadingQuality:Outline 覆盖项,默认 -1 表示继承全局质量

Shadow Blur 的质量档位会限制内部 Gaussian blur stage 数量并缩放 blur 半径;高质量 3 保持原有上限。Outline 的质量档位会降低临时 blur 纹理分辨率并减少 blur tap 数;高质量 3 保持原有 1/2 分辨率与 5-tap blur 行为。

后处理 / Scene Settings Untoon 控制

场景和 Post Process Settings 的 Global Illumination|Toon Lumen 分类下还有一组参数:

  • UntoonDiffuseIntensity:卡通光照漫反射强度
  • UntoonDiffuseFlatten:平整卡通光影漫反射
  • UntoonDiffuseSaturation:调整卡通光照漫反射的饱和度
  • UntoonDiffuseOcclusion:卡通光照遮蔽强度(AO)
  • UntoonSpecularIntensity:Untoon 高光强度

它们参与间接光合成与反射计算,所以 Lumen 路径受影响最明显。

推荐工作方式

灯光参数按灯光方案统一管理,不同角色类型共用一套预设;后处理参数尽量做成关卡或镜头预设。同一类风格参数别在材质、灯光、后处理三处各硬编码一份。

常见问题

  • 明暗边界太脏:先调 Untoon Light Smooth 和 Untoon Light Offset
  • 角色边缘不够立:检查 Rim Light 和 Outline 是否都在工作
  • 阴影过渡太写实:检查 Penumbra Tint 和 Shadow Blur 逻辑
  • 角色在环境光下发灰:检查 Untoon Diffuse Saturation 与 Occlusion
  • 普通 mesh 与 Nanite 阴影风格不一致:检查 ToonShadowMask / Toon Light 是否依赖了错误的 pass 语义或未对齐的 LightPassLight