创建: 2026-07-11
衰减公式
1. 经典二次衰减公式
这是最经典的图形学经验公式,通过常数、线性、二次方三个系数来共同控制光线的衰减,既能模拟物理特性,又能防止分母为 0 导致的数据爆炸。
$$ f_{\text{att}}(d) = \frac{1}{K_c + K_l \cdot d + K_q \cdot d^2} $$- $d$ (Distance):点表面到点光源的距离。
- $K_c$ (Constant):常数衰减系数。通常设为
1.0,保证距离为 0 时分母不为 0。 - $K_l$ (Linear):线性衰减系数。以线性方式降低光强,通常用来模拟光线穿透稀薄介质。
- $K_q$ (Quadratic):二次方衰减系数。模拟物理上的逆平方定律。
2. 物理逆平方衰减(理想状态)
根据能量守恒定律,点光源发出的光能均匀扩散在球面上,球面面积与半径二次方成正比。
$$ f_{\text{att}}(d) = \frac{1}{d^2} $$缺点:当 $d \to 0$ 时,光强趋近于无穷大;艺术可控性差。
3. 有界逆平方衰减
无论是哪种衰减公式,在数学上都不会等于 0,而在实时渲染中,不可能让点光影响影响无限远的场景,所以都会加入半径截断,但这也导致了光源边界无法完全自然衰减到 0 导致“突然被裁剪掉”的问题。 为了解决该问题,现代渲染引擎采用特殊的视窗淡出因子。以下是 Unreal Engine 4 所使用的平滑截断公式:
$$ f_{\text{att}}(d) = \frac{1}{d^2 + \epsilon} \cdot \max \left( 0, 1 - \left( \frac{d}{R} \right)^4 \right)^2 $$- $\epsilon$:一个极小的常数(如
0.0001或保护因子),防止当距离刚好为 0 时除以 0。 - $R$:光源的最大淡出半径(Attenuation Radius)。
点光剔除
- 点光剔除
点光阴影
- 点光阴影🔺