创建: 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)。

点光剔除

  • 点光剔除

点光阴影

  • 点光阴影🔺

版权声明

作者: Cheyne Xie

链接: https://chaim.eu.org/posts/b9dfa730/

许可证: CC BY-NC-SA 4.0

This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License. Please attribute the source, use non-commercially, and maintain the same license.

开始搜索

输入关键词搜索文章内容

↑↓
ESC
⌘K 快捷键