3、直接光照:定向光、点光源、聚光灯的原理与性能开销
直接光照,说白了就是光源直接照射到物体表面产生的光照效果。在Unreal里,我们最常用的三种直接光源就是定向光、点光源和聚光灯。这三种光源各有各的脾气,用好了画面出彩,用不好性能崩盘。今天我就结合自己的项目经验,跟大家聊聊它们的原理和性能开销。
3.1 定向光(Directional Light)
定向光模拟的是太阳光。它没有具体位置,只有方向。你想想看,太阳离我们那么远,光线基本是平行的。所以定向光照射到场景里,所有物体的阴影方向都是一致的。
核心原理:定向光的光照计算只依赖方向向量,不依赖位置。这意味着它的光照方程里没有距离衰减项。
我在项目中遇到过一个问题:室外场景用定向光做主光源,结果室内透过窗户照进来的光也是平行的,看起来特别假。后来我加了第二个定向光,调了个稍微不同的角度,模拟天光散射,效果才自然起来。
性能开销分析:
- 阴影开销:定向光的阴影是最贵的。因为它覆盖整个场景,需要渲染整个场景的深度图。我记得有一次项目里用了4K分辨率的级联阴影贴图(CSM),直接吃掉了一半的GPU时间。
- 动态光照:如果开启动态光照,每个像素都要计算光照方向。好在定向光的方向是全局统一的,计算量相对固定。
- 静态光照:烘焙光照贴图时,定向光是最便宜的。因为方向固定,烘焙一次就能用。
我的建议:室外场景用定向光时,级联阴影贴图的分辨率不要超过2048。我曾经试过4096,帧率直接掉了15帧。除非你的场景特别大,否则2048完全够用。
3.2 点光源(Point Light)
点光源模拟的是灯泡、蜡烛这类向四面八方均匀发光的物体。它有明确的位置,光线从中心向四周辐射,强度随距离衰减。
光照方程的核心:
// 点光源衰减公式(Unreal默认)
Attenuation = 1 / (Distance^2 * LightRadius)
// 实际项目中常用改进版
Attenuation = 1 / (1 + Distance^2 / LightRadius^2)
为什么要用改进版?因为纯平方衰减在距离为0时会无穷大,导致光源附近过曝。我刚开始做渲染时就被这个坑过——点光源放得太近,物体表面直接白成一片。
性能开销分析:
- 光源数量:点光源的性能开销跟数量直接相关。每个点光源都需要计算位置、方向、衰减。Unreal默认每个像素最多处理4个点光源,超过的部分会被忽略。
- 衰减半径:半径越大,影响的像素越多,开销越大。我习惯把点光源的半径控制在场景需要的范围内,不要为了省事给个超大半径。
- 阴影:点光源的阴影是最贵的。因为它需要渲染6个方向的深度图(立方体贴图)。一个带阴影的点光源,开销相当于6个定向光。
| 光源类型 | 阴影开销 | 动态光照开销 | 适用场景 |
|---|---|---|---|
| 定向光 | 中(CSM) | 低 | 室外主光源 |
| 点光源 | 高(6面) | 中 | 室内局部照明 |
| 聚光灯 | 中(1面) | 中 | 重点照明 |
避坑指南:我曾经在一个室内场景里放了20个带阴影的点光源,结果帧率直接掉到20帧。后来我把大部分点光源的阴影关掉,只保留主光源的阴影,帧率回到了60帧。记住:不是所有光源都需要阴影。
3.3 聚光灯(Spot Light)
聚光灯模拟的是手电筒、舞台追光这类有方向性的光源。它既有位置,又有方向,还有一个锥形范围。说白了就是点光源加了个方向限制。
核心参数:
- 内锥角(Inner Cone Angle):光照最强的区域
- 外锥角(Outer Cone Angle):光照衰减到0的区域
- 衰减指数(Falloff Exponent):控制从内锥到外锥的过渡速度
嗯,这里要注意:内锥角和外锥角的差值决定了光照过渡的柔和程度。差值越大,过渡越柔和。我在做舞台灯光效果时,把内锥角设成20度,外锥角设成45度,效果非常自然。
性能开销分析:
- 计算量:聚光灯比点光源多了一个锥形检测。每个像素都要判断是否在锥形范围内,这个判断本身开销不大。
- 阴影:聚光灯的阴影只需要渲染一个方向的深度图,开销跟定向光差不多。但因为它只覆盖锥形区域,实际影响范围小得多。
- 衰减:聚光灯的衰减计算比点光源复杂一些,多了角度衰减。不过现代GPU处理这点计算量绰绰有余。
我的经验:聚光灯是性能最好的动态光源。如果你需要做动态光照效果,优先考虑聚光灯。我在一个恐怖游戏项目里,用聚光灯模拟手电筒,开了阴影,帧率只掉了5帧。换成点光源的话,至少掉15帧。
3.4 三种光源的性能对比总结
说了这么多,咱们来做个总结。你想想看,在实际项目中该怎么选?
- 定向光:适合做主光源,尤其是室外场景。阴影开销中等,但覆盖范围大。建议只保留一个定向光带阴影。
- 点光源:适合做局部照明,比如灯泡、篝火。性能开销跟数量成正比,建议控制在5个以内带阴影的。
- 聚光灯:性能最优的动态光源。适合做重点照明、手电筒、舞台灯光。可以多用几个,但阴影数量还是要控制。
核心原则:光源数量越少越好,阴影数量越少越好。能用静态光照贴图解决的问题,就不要用动态光源。我见过太多项目因为光源太多导致性能崩盘,最后不得不返工。
好了,这一章的内容就到这里。下一章我们会聊间接光照和全局光照,那才是真正吃性能的地方。到时候我会分享一些我在项目中用到的优化技巧,保证让你少走弯路。