计算机图形:光照模型

发布时间 2023-11-12 18:00:25作者: 明明1109

基本概念

光照明模型(illumination model):对场景的对象进行透视投影后,用该模型在可见面上产生自然光效果,实现场景的真实感展示。

光照明模型也称光照模型(lighting model)或明暗模型(shading model),主要用于对象表面某光照位置的颜色计算。

表面绘制方法(surface rendering method)使用光照模型为对象的所有投影位置确定像素颜色。2种方式确定像素颜色:
1)对每一投影位置应用光照模型;
2)先对表面少数点应用光照模型,然后颜色插值。

明暗模型:面绘制过程,也称明暗方法,用于计算表面颜色。与光照模型区别:表面上单个点的光强度计算模型,称为光照模型;将应用一个光照模型获得所有投影的表面位置的像素颜色的过程,称为表面绘制(surface rendering algorithm。

真实感成像包含2部分:
1)表面特性的精确表示,如透视效果;
2)场景中光照效果的物理描述,如光照模型;

表面光照效果:光的反射、透明性、表面纹理和阴影。

光源

光源(light source:任意发出辐射能量的对象,称为一个光源,它对场景中其他对象的光照效果有贡献。

仅发光的物体,称为光照源;应用中,可能希望建立既是光源又是光反射体的对象,如塑料球内放置一个灯泡,这样球表面既发光也反射光。

彩色光源

人眼对三色值敏感,可将光源建模成红、绿、蓝3个分量的彩色光源。三元组描述:

\[I=\begin{bmatrix} I_r\\ I_g\\ I_b \end{bmatrix} \]

点光源

点光源(point lighting source):用RGB 3个分量指定单个颜色的发光体模型,也是最简单的光源模型。点光源由位置、发光颜色定义。

常用于:
1)比场景对象小得多的光源;
2)离场景不是很近的大光源;

从点光源发出的光线路径示意图:

无穷远光源

离场景非常远的大型光源,称为无穷远光源,如太阳,常用作环境光。

远距离光源,仅在一个方向照明场景。从远距离光源到场景中任意位置的光线路径接近不变。

环境光

环境光(ambient light):均匀的照明。如通过安装散光器,让房间内的照明均匀,这种光源就是环境光。
环境光由光照强度三元组\(I_a\)表征,场景中任意一点\(I_a\)相同。
环境光强度有R、G、B 3个分量:

\[I_a=\begin{bmatrix} I_{ar}\\ I_{ag}\\ I_{ab} \end{bmatrix} \]

三个分量分别代表独立的红、绿、蓝分量的强度。

tips:场景每个位置的环境光照强度相同,但不同表面的反射不一样,因为材质不同。

辐射强度衰减

辐射光线从一点光源发出,并在空间中传播,距离光源为\(d_l\)时,其振幅按因子\(1/d_l^2\)。含义是:接近光源的表面入射光强度更高,远离光源的表面入射光强度 更低。

光照模型中,必须考虑光强度衰减,否则难以得到真实感光照效果。

实际应用中,如果用因子\(1/d_i^2\)进行光强度衰减,则简单点光照明不能产生真实感图形。因为接近光源的对象,\(1/d_i^2\)产生过大的强度变化,而\(d_l\)很大时变化太小。

对于点光源,可用如下强度衰减函数来衰减光强度(d的2次多项式替代\(d^2\)):

\[\tag{1} f_{l,radatten}(d_l)= \begin{cases} 1, & 如果光源在无穷远处\\ {1\over a_0+a_1d_l+a_2d_l^2}, & 如果光源是局部光源 \end{cases} \]

用户可调整\(a_0, a_1, a_2\)的值,得到场景中不同的光照效果。i.g. 当\(d_l\)非常小时,可赋予常数项\(a_0\)一个大值来防止\(f_radatten(d_l)\)值变得太大。

方向光源、投射效果

对局部光源修改,可得到方向光源或投影光束。

建立方向光源(或称投影光源):除了位置、颜色外,需一个向量方向+角度范围\(θ_t\)。这将定义以光源向量方向为轴的一个圆周。

\(V_{light}\)为光源方向的单位向量,且记\(V_{obj}\)为从光源位置到一个对象位置的方向上的单位向量。则,

\[\tag{2} V_{obj}\cdot V_{light}=\cos \alpha \]

其中,α是光方向向量到对象的角距离。

如果将光圆锥角度限制为\(\theta_l \in (0°, 90°]\),当\(\cos \alpha >= \cos \theta_l\)时,则对象位于光锥体内;否则,则对象位于光锥体外。

方向点光源:
b3bf77a9c0fb93898b2c4ef028ac9053.png

方向点光源照明对象(三棱锥):
14aaf26f67c5d0e04652a00ee24223cd.png

角强度衰减

方向光源按光强度角度计算衰减。衰减函数:

\[\tag{3} f_{angatten}(\varPhi)=\cos ^{a_l}\varPhi, 0°\le \varPhi \le \theta \]

其中,衰减指数\(a_l\)赋以某个正值;角\(\varPhi\)从圆锥轴开始计算,圆锥轴上,\(\varPhi=0\)

光强度函数有几个特殊情况要考虑:
1)如果光源不是方向光源(即不是投影光源),则没有角强度衰减。
2)如果对象位于投影光圆锥体外,则得不到该光源的光照。

角强度衰减一般公式:

\[\tag{4} f_{l,angatten}=\begin{cases} 1.0, & 如果光源不是投影光源\\ 0.0, & 对象外语投射圆锥外 \\ (V_{obj}\cdot V_{light})^{a_l}, & 其他 \end{cases} \]

表面光照效果

光照模型使用为表面设定的各种光学特性计算表面的光照效果,特性包括:透明度、颜色反射系数、各种表面纹理参数。

  • 特性对光照效果的影响

不透明度:当光入射到不透明表面时,一部分被反射,另一部分被吸收。入射光反射量取决于材料类型。光亮表面反射光较多,灰暗表面吸收光较多。

漫反射(diffuse reflection):粗糙或颗粒状表面会将反射光向各方向散去的现象。粗糙、不光滑的表面,主要产生漫反射,因而各角度看表面亮度相同。对象漫反射光的颜色,称为该对象的颜色,如物体表现为黑色,是因为所有入射光被吸收。

镜面反射(specular reflection):有些反射光会集中成醒目的或明亮的一个点。表面光亮比灰暗发生得更多,如抛光的金属。

背景光(background light)或环境光(ambient light):场景中各表面的反射光生成的光照效果,致使对象不暴露在光源下也仍可见。

基本光照模型

用光照效果的物理过程近似表示,可简化计算。

光照模型中,发光体一般限于点光源。不过,很多图形软件包也提供处理方向光源(投射光源)的函数。

环境光

用参数\(I_a\)表示环境光层次。
设定场景一般亮度级 => 背景光 => 各照明表面全局漫反射

Lambert漫反射模型

理想漫反射体(ideal diffuse reflectors):假设入射光在各个方向以相同强度发散而与观察位置无关,这样的表面称为理想漫反射体。
朗伯余弦定律(Lambert's cosine law):也称朗伯反射体(Lambertian reflectors),描述光散射的一种定律,表明光散射强度与观察角的余弦成正比,即:

\[\tag{5} I(\theta)=I_N\cos \theta \]

其中,\(I(\theta)\)指与法向量成\(\theta\)角的散射强度,\(I_N\)指观察角度为0(法线方向)处的散射强度,\(\theta\)指观察角度(与入射点处物体表面的法向量角度),范围[0, 1]。

对于朗伯反射,(同一物体)所有观察方向的光强度都相同。

由于物体表面粗糙程度、材质不同,对光的反射效果也不同,确定一个参数\(k_d\)作为物体表面反射率,称为漫反射系数(diffuse reflection coefficient)或漫反射率(diffuse reflectivity)。

对于环境光\(I_a\),其漫反射光强为:

\[\tag{6} I_{ambdiff}=k_dI_a \]

其中,\(k_d\)为漫反射系数。

当入射光l⊥物体表面时,得到最多光照;当入射光与法线方向成一定角度θ(即入射角)时,得到更少光照,此时,强度为\(I_l\)的光源的有效入射光为:

\[\tag{7} I_{l,incident}=I_l\cos\theta \]

相当于入射光垂直于物体表面的分量,才是有效光照。

59082a4e3af38c3258e7f529b241df58.png

于是,物体表面对光源\(I_l\)的漫反射光强度为:

\[\tag{8} \begin{aligned} I_{l,diff}&=k_dI_{l,incident}\\ &=k_dI_l\cos\theta \end{aligned} \]

记N法线方向单位向量,L入射光反向的单位向量。一个点光源漫反射可表示为:

\[\tag{9} I_{l,diff}=\begin{cases} k_dI_l(N\cdot L), & N\cdot L >0(光源位于表面前)\\ 0.0, & N\cdot L \le 0 (光源位于表面后) \end{cases} \]

如果是环境光和点光源的组合,则漫反射可表示为:

\[\tag{10} I_{diff}=\begin{cases} k_aI_a+k_dI_l(N\cdot L), & N\cdot L > 0\\ k_aI_a, & N\cdot L \le 0 \end{cases} \]

其中,\(k_a、k_d\)分别表示表面对环境光、点光源的慢反射率,取决于表面材质。

如果点光源考虑距离衰减,Lambert漫反射模型可写为:

\[\tag{11} \begin{aligned} I_{diff}&=\begin{cases} k_aI_a+fk_dI_l(N\cdot L), & N\cdot L > 0\\ k_aI_a, & N\cdot L \le 0 \end{cases}\\ f&=max({1\over c_1+c_2d+c_3d^2},1) \end{aligned} \]

其中,f为光强衰减因子,\(c_1,c_2,c_3\)为用户确定的常数。

Phong模型(镜面反射)

反射=漫反射+镜面反射

光滑表面上看到的高光或镜面反射,是由接近镜面反射角(specular-reflection angle)的一个汇聚区域内,入射光全部或绝大部分被反射导致。

特点:镜面反射角=入射角。

下图是一个镜面反射示意图:
85a45fb2f7870c3b15234b2c70eb19e8.png

其中,L是入射光线反方向,N是法向量方向,R是反射光线方向,V是观察方向的反方向。入射角=反射镜=θ。

对于理想镜面反射,当V与R重合时(Φ=0),才能观察到反射光线;
对于非理想镜面反射,反射光线分布在向量R周围。

  • Phong模型

Phong镜面反射模型(Phong specular-reflection model):简称Phong模型(Phong model),镜面反射光强度与\(\cos^nΦ\)成正比。其中,\(Φ\in [0°, 90°]\)

Phong模型镜面反射可表示为:

\[\tag{12} I_{l,spec}=W(\theta)I_l\cos^{n_{s}} Φ \]

其中,\(I_l\)为光源强度,Φ为观察方向与镜面反射方向R的夹角。
W(θ)(θ入射角)为镜面反射系数(specular-reflection coefficient),近似表示单色镜面反射光强度的变化,因为镜面反射的光强主要由表面材质、入射角及其他属性(极性、入射光颜色等)决定。范围[0,1]。
\(n_s\)镜面反射参数(specular-reflection exponent),由表面材质决定:表面越光滑,值越大;越粗糙,值越小(到1)。理想反射器n=+∞。

对于透明材质(如玻璃),θ接近90°时才表现出镜面反射;
对于不透明材质(如粉笔),几乎所有入射角的镜面反射均为常量,可用常数\(k_s\)替代W(θ)。而cos Φ能用向量点乘V·R得到,因此,式(12)对应点光源的镜面反射可写成:

\[\tag{13} I_{l,spec}=\begin{cases} k_sI_l(V\cdot R)^{n_s}, & V\cdot R > 0\space and\space N\cdot L > 0\\ 0.0, & V\cdot R \le 0 \space or \space N\cdot L \le 0 \end{cases} \]

VR>0代表视点在表面前方;VR<=0代表视点在表面后方。
NL>0代表光源在表面前方;NL<0代表光源在表面后方。

如何得到向量R?

N·L=|N||L|cosθ=|N||L'|=|L'|, L'是L在N上投影
∴R+L=2N(N·L)
∴R=2N(N·L)-L

  • 简化的Phong模型

Phong是个纯几何模型,因为求解向量R麻烦。实践中,可用简化的Phong模型,即用半角向量(halfway vector)\(H={L+V\over |L+V|}\)计算镜面反射范围,将点积N·H替代V·R,经验值cos α替代cos Φ。当向量V与L、R共面时,α=Φ/2;否则,α>Φ/2。
事实上,我们还可以推理出Φ=α(证明略)。

69af1b1b687abd164a641a4ab57e7cb6.png

  • 漫反射结合镜面反射

对于单点光源,如果表面某点结合漫反射、镜面反射,光照模型可写为:

\[\tag{14} \begin{aligned} I&=I_{diff}+I_{spec}\\ &=k_aI_a+k_dI_l(N\cdot L)+k_sI_l(N\cdot H)^{n_s} \end{aligned} \]

当然,如果光源位于表面后面,则只有环境光,其他反射光为0。

  • 多点光源的漫反射和镜像反射

对于多个点光源,在任一表面点叠加各光源效果(环境光反射、漫反射、镜面反射):

\[\tag{15} \begin{aligned} I&=I_{ambdiff}+\sum_{l=1}^n[I_{l,diff}+I_{l,spec}]\\ &=k_aI_a+\sum_{l=1}^n I_l[k_d(N\cdot L)+k_s(N\cdot H)^{n_s}] \end{aligned} \]

如果考虑衰减(距离衰减、角度衰减),就要在光强上乘以对应衰减因子。

光强与RGB颜色

光照模型中,
对于每个光源,每个光照强度包含红、绿、蓝3分量,可表示为

\[\tag{16} I_l=(I_{lR},I_{lG},I_{lB}) \]

  • 反射系数

对于反射系数,也可用分量表示。环境光反射:\(k_a=(k_{aR},k_{aG},k_{aB})\),漫反射:\(k_d=(k_{dR},k_{dG},k_{dB})\),镜面反射:\(k_s=(k_{sR},k_{sG},k_{sB})\)

例如,一个点光源的漫反射模型可写为:

\[I_{lR,diff}=k_{dR}I_{lR}(N\cdot L_l)\\ I_{lG,diff}=k_{dG}I_{lG}(N\cdot L_l)\\ I_{lB,diff}=k_{dB}I_{lB}(N\cdot L_l) \]

模型为什么要针对不同颜色设计不同反射系数?
因为如果各种颜色反射相同,即与颜色无关,镜面反射光线与入射光线相同(白色),会使物品看起来像塑料,而实际不同颜色物体对不同颜色光反射不同。

  • 反射的颜色分量

也可将反射参数固定为常数,为每个表面定义漫反射、镜面反射的颜色向量。漫反射的表面颜色向量:\((S_{dR},S_{dG},S_{dB})\),镜面反射的表面颜色向量:\((S_{sR},S_{sG},S_{sB})\)
例如,一个点光源的蓝色漫反射模型可写为:

\[I_{lB,diff}=k_{d}S_{dB}I_{lB}(N\cdot L_l) \]

亮度

亮度(luminance)是颜色的一种特征,也称光能量,给出了颜色亮或暗的程度信息。

物理上,颜色用可见辐射能(光)的频率范围来描述,而亮度按在特定照明中的强度成分的加权总和来计算。实际光照包含连续范围的波长,亮度可表示为:

\[\tag{17} 亮度=\int_{visible \space f}p(f)I(f)df \]

其中,f表示光频率,I(f)表示在特定方向辐射的波长为f的光成分;p(f)表示按经验确定的比例函数,按频率和光照程度而变化。

对于RGB光源的亮度,绿色分量贡献最大,蓝色最小,因此亮度计算:

\[\tag{18} 亮度=0.299R+0.587G+0.114B \]

透明表面

透明的(transparent):透过对象,能看到后面的东西。只有折射。
不透明的(opaque):不能透过对象看到后面的东西。只有反射。
半透明的(translucent):介于两者之间。同时有折射和反射。

光折射

光折射(refraction):当光线入射到一个透明对象表面时,一部分光线被反射,另一部分被折射。可模拟真实透明效果。

Snell定律,即光的折射定律:

\[\sin \theta_r={\eta_i\over \eta_r}\sin \theta_i \]

其中,\(\theta_i\)是入射角,也是反射角;\(\eta_i\)是入射材料的折射率,\(\eta_r\)是折射材料的折射率。

0aac59c19d1a2ffcb43dd448c0c61d32.png

  • 折射率

折射率取决于材质、温度、入射光波长等参数。白光的各种彩色成分(波长不同),会以不同角度折射。通常用平均折射率描述材料的折射率。空气的折射率常设为1。

如何得到折射方向单位向量?
结论:

\[\tag{19} T=({\eta_i\over \eta_r}\cos \theta_i - \cos \theta_r)N-{\eta_i\over \eta_r}L \]

证明:
f9eb54617c47e60e7da3ef07a26fb908.png

向量L中与向量N垂直的分量\(perp_NL=L-N(L\cdot N)\),又作为L为斜边的直角三角形的边,模为\(|perp_NL|=|L|\sin \theta_i=\sin \theta_i\)
向量G为垂直于向量N的单位向量,有\(G//{perp_NL}\)
因此,

\[G={perp_NL\over |perp_NL|}={L-N(L\cdot N)\over \sin \theta_i} \]

向量T可分解为向量N、G方向上的2个分量:\(perpG_T=-N\cos\theta_r, perp_NT= -G\sin\theta_r\)
因此,T可表示为:

\[\begin{aligned} T&=perpG_T+perp_NT\\ &=-N\cos\theta_r+-G\sin\theta_r\\ &=({\sin\theta_r\over \sin\theta_i}\cos\theta_i-\cos\theta_r)N-{\sin\theta_r\over \sin\theta_i}L\\ &=({\eta_i\over \eta_r}\cos \theta_i - \cos \theta_r)N-{\eta_i\over \eta_r}L (由Snell定律) \end{aligned} \]

简单透明模型

不考虑折射导致的路径平移,假定各对象折射率不变、折射角=入射角。

对象表面总光强:

\[\tag{20} I=(1-k_t)I_{refl}+k_tI_{trans} \]

其中,\(k_t、(1-k_t)\)分别为透明系数、不透明因子(opacity factor),范围0~1。

通过深度优先(从后到前),可混合任意多透明和不透明对象的光照效果。

参考

计算机图形学(一)——辐照度学概述
第八章 光照
伦吉尔,E.).3D游戏与计算机图形学中的数学方法(第3版)[M].清华大学出版社,2016.