2. 定向光源:太阳光设置、阴影参数、大气效果联动、动态时间系统

定向光源,说白了就是咱们场景里的太阳。它跟点光源、聚光灯最大的区别在于——它没有位置,只有方向。你把它放在哪,光照效果都一样。这个特性让它天然适合模拟太阳光。

我刚开始用UE5的时候,总觉得定向光源太简单了,不就是个平行光嘛。后来做开放世界项目才发现,这里面的门道真不少。尤其是跟大气系统联动起来,效果天差地别。

2.1 太阳光的基础设置

创建一个定向光源很简单,拖一个到场景里就行。但真正要调出好看的太阳光,你得关注这几个参数:

  • 强度(Intensity):默认是10 lux,这其实很暗。我一般室外场景直接拉到100-150 lux。如果是黄昏,降到30-50 lux会更真实。
  • 光源颜色(Light Color):正午用偏白的淡黄色(#FFF5E0),黄昏用暖橙色(#FF8844)。别用纯白,太假了。
  • 角度(Source Angle):这个控制太阳的视觉大小,默认0.5度。调大一点,阴影边缘会变柔和。我习惯室外场景用0.8-1.2度,阴影看起来更自然。
我的小技巧: 如果你想让太阳光有更丰富的色彩变化,可以试试在光源颜色里加一点点淡蓝或淡紫。尤其是清晨和黄昏,这种微妙的色偏会让画面更有层次感。

2.2 阴影参数:别让阴影毁了你的场景

阴影是定向光源最头疼的部分。调好了,场景立体感爆棚;调不好,满屏锯齿和闪烁。我踩过不少坑,这里直接说重点。

2.2.1 动态阴影 vs 静态阴影

UE5的定向光源默认使用动态阴影,也就是实时计算的阴影。好处是准确,坏处是性能开销大。对于开放世界,我建议这样搭配:

  • 近处物体:用动态阴影,分辨率调高(2048或4096)
  • 远处物体:用级联阴影映射(CSM),分3-4级,每级分辨率递减
  • 静态物体:烘焙阴影,完全不消耗运行时性能

2.2.2 级联阴影映射(CSM)

CSM是定向光源的核心阴影技术。它把视锥体分成几段,每段单独渲染阴影贴图。参数在定向光源的细节面板里:

参数 推荐值 说明
Dynamic Shadow Distance 5000-10000 阴影可见距离,太远性能扛不住
Num Dynamic Shadow Cascades 3-4 级联数量,3级够用,4级更平滑
Cascade Distribution Exponent 1.0-2.0 级联分布,值越大近处级联越密
Shadow Filter Sharpen 0.5-0.8 阴影锐度,调太高会有锯齿

嗯,这里要注意:Cascade Distribution Exponent这个参数很关键。我见过很多新手把它设成3.0,结果近处阴影特别清晰,远处突然变模糊,过渡非常生硬。我个人习惯用1.5,然后手动调整每级的分辨率。

避坑指南: 我曾经在一个森林场景里,把CSM的级数设成了5级,想着阴影质量越高越好。结果帧率直接掉了20帧。后来发现,3级CSM配合适当的模糊,效果完全够用。别盲目堆参数。

2.3 大气效果联动:让太阳光活起来

UE5的大气系统(Atmosphere)和定向光源是天生一对。没有大气,太阳光就是个干巴巴的平行光;有了大气,你才能看到天空颜色变化、云层散射、体积光这些效果。

2.3.1 启用大气系统

在场景里放一个BP_SkySphere或者VolumetricCloud组件,定向光源会自动识别并产生联动。关键参数在定向光源的Atmosphere and Cloud分类下:

  • Atmosphere Sun Light:勾选后,定向光源才会参与大气计算
  • Atmosphere Sun Light Color:控制大气散射的颜色,一般跟光源颜色保持一致
  • Cloud Shadow Strength:云层阴影强度,0.5-0.8比较自然

2.3.2 体积光(Volumetric Scattering)

想让太阳光有那种「丁达尔效应」的光柱效果?你需要开启体积光。在定向光源的Light Shafts分类里:

// 体积光参数推荐
bEnableLightShaftOcclusion: true
OcclusionMaskDarkness: 0.3
OcclusionDepthRange: 1000
LightShaftOverrideDirection: (0,0,0) // 使用光源方向

我做过一个项目,需要表现清晨森林里的光束效果。当时把OcclusionMaskDarkness调到了0.5,结果光束太强,整个场景像开了滤镜一样。后来降到0.2,配合体积雾,效果才自然。说白了,体积光是个锦上添花的东西,别喧宾夺主。

2.4 动态时间系统:让太阳动起来

动态时间系统,就是让定向光源的位置随时间变化,模拟太阳从东升到西落的过程。UE5里实现这个功能,我一般用两种方式:

2.4.1 蓝图控制

创建一个蓝图,用时间轴(Timeline)控制定向光源的旋转。核心逻辑很简单:

// 伪代码示例
float TimeOfDay = 0.0f; // 0-24小时
FRotator SunRotation;

// 计算太阳高度角
float SunAltitude = sin(TimeOfDay / 24.0f * PI);
// 计算太阳方位角
float SunAzimuth = TimeOfDay / 24.0f * 360.0f;

SunRotation.Pitch = SunAltitude * 90.0f; // 0度在地平线,90度在头顶
SunRotation.Yaw = SunAzimuth;

// 应用到定向光源
DirectionalLight->SetActorRotation(SunRotation);

你想想看,这个逻辑其实很简单。但实际项目中,我还会加入颜色插值:正午偏白,黄昏偏橙,夜晚偏蓝。用Lerp节点就能搞定。

2.4.2 使用DaySequence

UE5的DaySequence是个好东西。它把时间系统、光照、大气、云层都整合在一起。你只需要在World Settings里指定一个DaySequence Actor,然后调整关键帧就行。

我个人更推荐用DaySequence,因为它自动处理了大气和云的联动。你调时间,天空颜色、云层密度、太阳位置都会跟着变。省心不少。

核心要点: 动态时间系统不只是让太阳转圈。你要考虑光照颜色、阴影长度、大气散射、云层阴影这些因素的同步变化。一个好的时间系统,能让场景在24小时内都有不同的视觉体验。

2.5 知识体系结构图

下面这张图,是我对本章知识点的梳理。你可以看到,定向光源的核心是「太阳光设置」和「阴影参数」,而「大气效果联动」和「动态时间系统」则是进阶玩法。它们之间是层层递进的关系。

定向光源 太阳光设置 强度、颜色、角度 阴影参数 动态阴影 CSM级联 阴影过滤 大气效果联动 大气散射 体积光 动态时间系统 蓝图控制 DaySequence 核心:四者联动,才能做出真实的太阳光效果 设置 → 阴影 → 大气 → 时间,层层递进

2.6 实战建议

最后,给你几个我在项目中总结的实战建议:

  1. 先调静态,再调动态:先把定向光源在某个时间点(比如正午)调好,再去做动态时间系统。否则你一边调颜色一边改时间,很容易乱。
  2. 阴影距离别贪大:Dynamic Shadow Distance设到10000以上,性能就开始吃紧了。我一般室外场景用8000,室内用3000。
  3. 大气联动一定要开:哪怕你只是做个简单的室内场景,也建议勾选Atmosphere Sun Light。它会让光照更自然,尤其是间接光照部分。
  4. 用Profile工具看性能:调阴影参数时,打开GPU Profile,看看阴影渲染占了多少时间。如果超过2ms,就该优化了。

嗯,定向光源这部分就讲到这里。记住,太阳光不是越亮越好,阴影不是越清晰越好。真实感来自于平衡——强度、颜色、阴影、大气,四者缺一不可。


专注资料整理