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,然后手动调整每级的分辨率。
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,因为它自动处理了大气和云的联动。你调时间,天空颜色、云层密度、太阳位置都会跟着变。省心不少。
2.5 知识体系结构图
下面这张图,是我对本章知识点的梳理。你可以看到,定向光源的核心是「太阳光设置」和「阴影参数」,而「大气效果联动」和「动态时间系统」则是进阶玩法。它们之间是层层递进的关系。
2.6 实战建议
最后,给你几个我在项目中总结的实战建议:
- 先调静态,再调动态:先把定向光源在某个时间点(比如正午)调好,再去做动态时间系统。否则你一边调颜色一边改时间,很容易乱。
- 阴影距离别贪大:Dynamic Shadow Distance设到10000以上,性能就开始吃紧了。我一般室外场景用8000,室内用3000。
- 大气联动一定要开:哪怕你只是做个简单的室内场景,也建议勾选Atmosphere Sun Light。它会让光照更自然,尤其是间接光照部分。
- 用Profile工具看性能:调阴影参数时,打开GPU Profile,看看阴影渲染占了多少时间。如果超过2ms,就该优化了。
嗯,定向光源这部分就讲到这里。记住,太阳光不是越亮越好,阴影不是越清晰越好。真实感来自于平衡——强度、颜色、阴影、大气,四者缺一不可。