跳到主要内容

控制角色和场景的光照

仅仅提供卡通材质还不能满足使用UE创作极致风格化内容的要求, 在实际项目中, 我们既想要高效和鲁棒 (游戏项目中同一个材质需要适应各种灯光环境, 并最小化性能开销), 又想要自由度 (电影项目中需要自由且精准调整每个颜色), 平衡他们是非常困难的.

制作MooaToon正是为了解决这些问题, 本文将向你介绍MooaToon的基本光照逻辑, 以及与UE默认的光照有何区别, 以帮助你深入理解并使用MooaToon.

UE默认光照

与其他PBR渲染器一样, UE默认的光照分为直接光照间接光照, 并且可以进一步细分为漫反射镜面反射, 所有光照通过加法累积起来, 并确保能量守恒.

接下来我会简单为你介绍UE默认光照的组成, 如果你已经非常熟悉UE的光照, 那么可以跳过这部分.

间接光照

着色点接收到的来自其他物体的反弹光, 以及来自大气散射的光. 也就是所谓的全局光照 (GI).

通常使用间接光来控制物体背光面颜色:

  • 室外主要通过天光控制间接光
  • 室内则通过其他直接光的数量和面积控制间接光

直接光照

着色点接收到的直接来自光源的光, 光源被遮挡则产生阴影. 直接光由方向光, 点光源, 聚光灯, 面光源产生.

漫反射与镜面反射

光照射到物体表面会发生反射吸收. 当物体吸收绿色和蓝色波长的光而反射红色波长的光时, 它看起来就是红色, 不同的材料会反射与吸收不同波长, 于是我们才能看到五彩斑斓的世界.

无限放大物体表面, 我们假设每个最小的着色点都是平滑的, 当光线打在着色点上时会向各个方向产生反射, 其中反射角等于入射角的是镜面反射, 其他方向的是漫反射:

漫反射的强度在各个角度观察都是相等的, 而镜面反射则会因为微观表面不同的法线分布产生清晰或模糊的高光, 形成宏观上光滑或粗糙的材质:

(GAMES101)

组合所有光照

光照分量预览总光照
间接漫反射
间接镜面反射
直接漫反射
直接镜面反射

基本材质输入

固有色粗糙度金属度
代表非金属材料的漫反射颜色, 或金属材料的镜面反射颜色微表面法线的随机程度, 越粗糙则镜面反射越模糊用于宏观上混合金属材料和非金属材料, 比如表面有灰尘的金属

由于金属材料特殊的性质, 它的反射率很高, 吸收率很低, 且光很难进入其内部. 因此金属没有漫反射, 但镜面反射很强, UE通过固有色控制金属材料的镜面反射颜色.

对于非金属材料, 固有色控制其漫反射颜色. 其镜面反射为白色, 并且可以根据其反射率调整强度.

MooaToon光照

MooaToon的原则是在保持对UE原生光照的兼容性的同时尽可能提高自由度, 并且在添加新功能的时候保持高鲁棒性和通用性.

接下来我将为你介绍Toon材质的光照与UE不同的部分:

漫反射

将PBR的兰伯特漫反射光照替换为Ramp光照是MooaToon最重要的特性之一, 并且通过Global Ramp Atlas使Ramp光照完美支持多光源, 解决了传统卡通渲染的痛点.

如下图所示, Ramp光照即可以实现与PBR相同的外观, 又可以实现完全自定义的明暗过渡:

PBR兰伯特漫反射二值化Ramp光照3色阶Ramp光照皮肤Ramp光照

具体用法如前文所述.

镜面反射

与漫反射类似, MooaToon仍然使用Ramp来自定义镜面反射的颜色和形状, 不过横坐标略有不同.
Specular Color Ramp的横坐标是根据经验归一化后的高光强度:

  • 0对应高光点边缘
  • 1对应高光点中心
二值化
软边
更软
3色阶
彩色色阶

直接光照

PBR的直接光照不可能照亮物体背面, 但由于Toon材质使用Ramp光照自定义漫反射, 所以物体背面也是可以被照亮的.

Toon材质的Shadow Color用于控制背光面的颜色, 当Shadow Color大于0且只有一个方向光时, 这没什么问题.
但是有多个光源时, 由于每个光源的背光面都被照亮了, 可能导致角色比场景亮的多.

大部分情况下我们希望只有一个主光贡献Shadow Color, 以避免角色太亮.
MooaToon在后处理体积上添加了Shadow Color Intensity以控制不同类型的光源是否贡献Shadow Color, 默认只有方向光的Shadow Color Intensity为1.

下图展示了在有一个方向光和点光的情况下如何避免过亮:

Shadow Color Intensity Point Lights = 0Shadow Color Intensity Point Lights = 1
Shadow Color = 0
Shadow Color = 0.05

间接光照

一些卡通渲染项目希望角色和场景的间接光照一致, 但又不希望角色体积感太强, MooaToon在后处理体积中添加了GI Directionality以解决这个问题.

GI Directionality为1时Toon材质的间接光使用UE自带的GI (如Lumen), 此时体积感最强, 和场景保持一致.
GI Directionality为0时使用球谐光照各方向的平均值, 此时间接光为均一颜色, 体积感最弱:

GI Directionality = 1GI Directionality = 0

由于球谐光照由天光提供, 而室内没有天光, 球谐光照为黑色, 所以室内需要将GI Directionality设为1.

除此之外MooaToon还提供了GI ColorGI Intensity参数可用于完全覆盖UE的GI颜色, 以单独控制角色GI颜色.

分离角色和场景的光照

一些卡通渲染项目希望将角色和场景的光照分离, 以精确控制角色颜色.
通常会为角色和场景设置不同的光照通道来实现这一点, 但是默认的UE会将阴影也分离, 这是不符合预期的:

MooaToon在Primitive Component上新增了Mooa Cast Shadows to Lighting Channels用于自由控制物体向那个光照通道投射阴影.
默认向所有光照通道投射阴影, 可以实现角色和场景的光照分离但是阴影合并.

角色光照的最佳实践

GI / Ramp / Shadow Color都对角色的背光面颜色有很大影响, 所以如果没有明确的光照规范就很容易陷入混乱.
在大规模生产之前你必须根据你的项目类型决定光照规范:

  • Shadow Color优先: 最佳自由度, 适合电影等光照完全可控的项目, 角色的背光面颜色主要来自Shadow Color.
  • GI优先: 最佳鲁棒性, 适合开放世界游戏等光照不完全可控的项目, 角色的背光面颜色主要来自GI.

- Shadow Color优先

MooaToon默认设置就是Shadow Color优先, 也就是不使用GI, 而完全使用Shadow Color来控制角色背光面颜色.
请按照以下步骤设置角色在标准环境中的光照:

  1. 打开L_LookDev场景并放入角色
  2. 确保GI Intensity为0 (在BP_MooaLookDevTool或后处理体积中)
  3. 检查是否有其他影响颜色的后处理, 并根据你的项目的需求设置, 例如:
    1. Tone Curve Amount, 设为0则最大程度还原贴图颜色, 但高光容易过曝. 该值应该在整个项目中保持一致.
  4. 确保灯光强度为3.1415, 颜色为白色
  5. 根据你的项目风格设置场景的光比:
    1. 打开Sky Light, 根据场景阴影区域亮度调整Sky Light Intensity
  6. 确保角色材质中选择的Diffuse Color Ramp为默认二值化
  7. 根据你的项目风格设置角色的光比:
    1. 调整材质中的Shadow ColorShadow Color Map到你满意的颜色
  8. 根据之前的教程继续优化角色外观
  9. 最后你可以按需选择或创建其他Ramp

在标准环境中完成设置后, 你的角色应该能够在其他光照环境下保持一致.
如果需要进一步调整角色在特定环境下的外观, 你可以:

  1. 使用光照通道分离角色和场景的光照
  2. 使用后处理调整颜色
  3. 为该场景单独创建材质或贴图

- GI优先

优先使用GI作为角色背光面颜色, Shadow Color默认应为黑色, 且只用于提亮少数特殊材质 (比如皮肤) 的背光面.
请按照以下步骤设置角色在标准环境中的光照:

  1. 打开L_LookDev场景并放入角色
  2. (在BP_MooaLookDevTool或后处理体积中) 检查是否有其他影响颜色的后处理, 并根据你的项目的需求设置, 例如:
    1. Tone Curve Amount, 设为0则最大程度还原贴图颜色, 但高光容易过曝. 该值应该在整个项目中保持一致.
  3. 确保灯光强度为3.1415, 颜色为白色
  4. 根据你的项目风格设置场景的光比:
    1. 打开Sky Light, 根据场景阴影区域亮度调整Sky Light Intensity
  5. 确保角色材质中选择的Diffuse Color Ramp为默认二值化
  6. 根据你的项目风格设置角色的光比:
    1. 确保材质中的Shadow Color为黑色
    2. 按需调整GI IntensityGI Directionality
  7. 根据之前的教程继续优化角色外观
    1. 提亮部分特殊材质 (如皮肤和眼睛) 的Shadow Color
  8. 最后你可以按需选择或创建其他Ramp

在标准环境中完成设置后, 你的角色应该能够在其他光照环境下保持一致.
如果需要进一步调整角色在特定环境下的外观, 你可以:

  1. 在后处理体积中调整GI参数
  2. 使用光照通道分离角色和场景的光照
  3. 使用后处理调整颜色

角色室内光照

室内通常没有方向光和天光, 为了确保角色在室内也有正确的光照, 你需要检查后处理体积:

  1. GI Directionality应该为1
  2. GI Intensity应该大于0
  3. Shadow Color Intensity Point/Spot/Rect Lights不应该全部为0
GI Intensity = 0
Shadow Color Intensity = 0
GI Intensity = 1
Shadow Color Intensity = 1