【技术美术】光照模型

本文最后更新于 2025年5月7日 晚上

【技术美术】光照模型

光照模型实际就是用于计算光照效果的方法,发展至今已有多种光照模型可用。

光照类型

从来源分类

  • 直接光:直接来自光源的光。
  • 间接光:通过其他表面反射的光。

从组成分类

  • 漫射光:光在粗糙的表面进行多次反射后再反射进眼睛的光。
  • 镜射光:光在光滑表面进行一次反射后直接反射进眼睛的光。
  • 环境光:从其他物体表面反射的光照在物体上后再反射的光。
  • 次表面散射:光通过一些半透明的物体内部后再反射进眼睛的光。

光照模型类型

从计算范围分类

  • 局部光照模型:只计算直接光,或环境光等直接打在物体上的光照效果。
  • 全局光照模型:在局部光照模型基础上,还会考虑光折射反射后打在物体上的效果。

从计算原理分类

  • 经验模型:基于人们对光照现象的直观感受,用经验编写的公式来模拟光照。
  • PBR 模型:基于物理的渲染方式(Physically-Based Rendering),这类模型基于真实的物理现象和公式演化而来。相较经验模型,拥有更真实的呈现效果和物理正确性。

从着色风格分类

  • Gouraud:为每一顶点计算光照,再通过插值的方式得出最终效果。

从函数类型分类

  • BRDF(双向反射分布函数):

    用于计算入射光与反射光关系的函数,即计算漫射光和近射光等从物体表面直接反射的光的函数。是常见游戏引擎中所使用的利用光栅化计算的光照模型。

  • BTDF(双向投射分布函数):

    用于计算入射光与投射光关系的函数,即计算透过物体内部再折射出的光(次表面散射)的函数。

  • BSDF(双向散射分布函数):

    BRDF 和 BTDF 的超集,是既计算反射光也计算折射光的函数。是常见图形软件中烘焙灯光时所使用的光照模型。

主流光照模型

Lambert

https://en.wikipedia.org/wiki/Lambertian_reflectance

1760 年提出,是只考虑了漫射光的简单模型,其通过点乘模拟漫射强度的思想,奠定了后续光照模型的基础。

  • 光照信息
    • kdk_d:表面对每单位漫射光的反射率(不考虑衰减)。
    • im,di_{m,d}:表面接收到的灯光 m 的漫射光(不考虑角度衰减)。
  • 方向信息
    • NN:表面法线。
    • LmL_m:表面到灯光 m 的方向。

Lambert=mkd(LmN)im,dLambert=\sum_{m} k_d (L_m \cdot N) * i_{m,d}

Phong

https://en.wikipedia.org/wiki/Phong_reflection_model

1975 年提出,是一个完整的局部光照模型,在 Lambert 的基础上还考虑了环境光和镜射光。

  • 光照信息
    • kdk_d:表面对每单位漫射光的反射率(不考虑衰减)。
    • ksk_s:表面对每单位镜射光的反射率(不考虑衰减)。
    • kak_a:表面对每单位环境光的反射率。
    • im,di_{m,d}:表面接收到的灯光 m 的漫射光(不考虑角度衰减)。
    • im,si_{m,s}:表面接收到的灯光 m 的镜射光(不考虑角度衰减)。
    • iai_{a}:表面接收到的环境光。
  • 方向信息
    • NN:表面法线。
    • LmL_m:表面到灯光 m 的方向。
    • VV:表面到相机方向。
  • 其他参数
    • ss:光泽度

Phong=kaia+mkd(LmN)im,d+ks(reflect(Lm,N)V)Sim,sPhong = k_ai_a + \sum_{m}k_d(L_m \cdot N)i_{m,d} + k_s(\operatorname{reflect}(-L_m,N) \cdot V)^Si_{m,s}

可以看出 Phong 模型中,漫射光系数采用与 Lambert 一致的方式,比较特别的是增加了镜射光,其镜射系数计算公式为:

factors=(reflect(Lm,N)V)Sfactor_s = (\operatorname{reflect}(-L_m,N) \cdot V)^S

Blinn-Phong

https://en.wikipedia.org/wiki/Blinn–Phong_reflection_model

一个改进版的 Phong 模型,对其镜射光的计算方式进行了调整,有更高的计算效率和更好高光效果,是过去很多图形接口的内置光照模型。

Blinn-Phong 和 Phong 的区别在于,其对镜射系数的计算方式上做了修改:

factors=(normalize(Lm+V)N)4sfactor_s = (\operatorname{normalize}(L_m+V) \cdot N) ^ {4s}

这种方式改用半角向量点乘法线来得出镜射强度,相比原版,高光边缘会更清晰真实,不过光斑范围会变大,因此需增强光泽度系数。

CookTorrance

https://graphicscompendium.com/gamedev/15-pbr

1982 年提出,相比前几代的经验光照模型,由于其是基于真实物理现象设计(PBR 模型),因此拥有更真实的呈现效果和物理正确性,如今更是被广泛使用。

由于 CookTorrance 过于复杂,详细信息见文章“基于物理的渲染”。


【技术美术】光照模型
https://bdffzi-blog.pages.dev/posts/6523980.html
作者
BDFFZI
发布于
2024年12月2日
许可协议