彩色阴影半影效果揭秘:编辑引擎着色器轻松实现,附对比截图与留言互动
2026年5月2日,我在社交媒体帖子上看到Romain Durand实现的彩色半影或彩色阴影边界效果后,尝试实现并分享出来。Shahriar Shahrabi的Medium文章讲解了其中原理。
实现该效果有多种方法,我选择编辑引擎着色器,其优缺点如下:
- 操作简单,无需像使用后期处理解决方案那样猜测光照或阴影对应值,在使用Lumen或昼夜循环时不会麻烦。
- 适用于所有类型的灯光。
- 实现成本极低。
- 颜色饱和度只能全局配置,不能针对每个灯光或每个场景单独配置。
- 该效果需要较宽的半影才能显现出来。
- 此实现仅适用于动态灯光,不适用于烘焙灯光。
由于只是编辑引擎着色器,而不修改引擎本身,所以可以使用Launcher版本。我在之前关于编辑引擎着色器的帖子中详细介绍过,需阅读该帖子了解具体操作。
实现步骤
使用Substrate的情况
打开`Engine\Shaders\Private\Substrate\SubstrateDeferredLighting.ush`文件,在(UE 5.7版本中)第190行找到代码`float3 SpecularLuminance = BSDFEvaluate.IntegratedSpecularValue * LightData.SpecularScale;`,在其后面添加以下代码:
// 彩色阴影半影 - 开始 const float PenumbraSaturation = 4.0f; // 根据喜好配置(1.0表示无变化) float3 LuminanceFactors = float3(0.3f, 0.59f, 0.11f); // 用于去饱和的亮度因子 float3 PenumbraColor = dot(DiffuseLuminance, LuminanceFactors); // 去饱和 PenumbraColor = lerp(PenumbraColor, DiffuseLuminance, PenumbraSaturation); // 应用饱和度(反向去饱和) DiffuseLuminance = lerp(DiffuseLuminance, PenumbraColor, 1.0f - BSDFShadowTerms.SurfaceShadow); // 混合 // 彩色阴影半影 - 结束不使用Substrate的情况
打开`Engine\Shaders\Private\DeferredLightPixelShaders.usf`文件,在(UE 5.7版本中)第397行找到代码`OutColor += Radiance;`,在其后面添加以下代码:
// 彩色阴影半影 - 开始 const float PenumbraSaturation = 4.0f; // 根据喜好配置(1.0表示无变化) float3 LuminanceFactors = float3(0.3f, 0.59f, 0.11f); // 用于去饱和的亮度因子 float3 PenumbraColor = dot(OutColor.xyz, LuminanceFactors); // 去饱和 PenumbraColor = lerp(PenumbraColor, OutColor.xyz, PenumbraSaturation); // 应用饱和度(反向去饱和) OutColor.xyz = lerp(OutColor.xyz, PenumbraColor, 1.0f - SurfaceShadow); // 混合 // 彩色阴影半影 - 结束保存着色器文件,返回Unreal并按下`Ctrl` + `Shift` + `.`,然后在着色器重新编译时去喝杯咖啡。
以下是应用彩色半影效果和未应用效果的对比截图,展示了Quixel中的几个场景:
上一张 下一张
上一张 下一张
为展示效果,对比截图中的效果比较明显,可能需要将`PenumbraSaturation`的值调低。另外,此实现会改变表面颜色使其更饱和,灰色或完全饱和的表面不会有效果。
若有任何意见或问题,可在相关的Twitter帖子、Bluesky帖子、ArtStation帖子或LinkedIn帖子下留言。