文章目录
- 渲染管线中光照的计算
- 前言
- 法向量
- 朗伯余弦定律
- 漫反射
- 环境光照
- 镜面光照
- 菲涅尔效应
- 表面粗糙度
- 光照模型
- 平行光源
- 点光源
- 衰减
- 聚光灯
渲染管线中光照的计算
前言
首先我们来看一下同一个模型在有光与无光下的区别:
无光:
有光
很明显的感知就是无光下渲染的模型,给人的感受是扁平化,不像一个模型,但是在经过光照渲染之后,就可以感受出立体效果。光照下的模型经过光照(lighting)与阴影(shading)的叠加,给我们展现出了很好的立体效果。而我们所看到的颜色,是依靠模型的材质呈现的。
看下图,在同一个平行光源(后面会讲解)下,同一个物体,不同材质下所呈现的结果不同,材质呢,有粗糙度,如石头,与瓷砖,当然还有金属度、折射率、透明度等。A球就是带透明的,因此,他在光照的影响下产生了折射,所以我们能看见它背后的物体,而B球则不能。人眼看见光的原因是因为光照射到物体上时候,一部分会被吸收,一部分会被反射,反射的光进入人眼,光受体感受到刺激,将信号传入大脑,也就是我们所能看到颜色的原因。
法向量
法向量是指垂直于给定曲面、曲线或几何体的向量(对于曲面就是垂直于切线空间)。下图就是相对于A点的法向量
朗伯余弦定律
光可以看作是光子的集合,在空间中按特定的方向传播。每个光子都载有(光)能量。光源每
秒发出的(光)能量称为辐射通量(radiant flux)。而单位面积上的辐射通量密度(irradiance,称为辐(射)
照度)。我们将辐射通量用来确定表面某区域所接收到的光量(即眼晴感受到的明亮度)。
一个面元的辐亮度或光亮度在其表面上半球的所有方向相等时,则有 E θ = E n c o s θ = E n ( n ⋅ L ) E_θ=E_ncosθ = E_n(n·L) Eθ=Encosθ=En(n⋅L)
式中, E θ E_θ Eθ和 E n E_n En分别表示面元在 θ 角(与表面法线夹角)方向及其法线方向的辐射强度或光强度, n n n是法向量, L L L光向量
(可以理解越接近于垂直照射的光,能量越强)
考虑到 ( n ⋅ L ) = c o s θ (n·L) =cosθ (n⋅L)=cosθ 这值是有可能小于0的,因此,给它限定了一下范围
f ( θ ) = m a x ( c o s θ , 0 ) = m a x ( n ⋅ L , 0 ) ( 也就是要求它大于等于 0 ) f(θ) = max(cosθ,0)=max(n·L,0) (也就是要求它大于等于0) f(θ)=max(cosθ,0)=max(n⋅L,0)(也就是要求它大于等于0)
这部分建议大家参考百度文库的资料
漫反射
当光照射到物体表面上某个点时候,一部分会被吸收,一部分会被四处反弹。(因为看似是平面的物体,其实放大之后,是凹凸不平的)
假设一点的有80%白光的入射光量,而这点的漫反射率是50%的红光,100%的绿光,75%的蓝光,则入射光量值 B L = ( 0.8 , 0.8 , 0.8 ) B_L=(0.8,0.8,0.8) BL=(0.8,0.8,0.8),漫反射率为 m d = ( 0.5 , 1.0 , 0.75 ) m_d=(0.5,1.0,0.75) md=(0.5,1.0,0.75)则这个点的反射光量是:
c d = B L ⊙ m d = ( 0.8 , 0.8 , 0.8 ) ⊙ ( 0.5 , 1.0 , 0.75 ) = ( 0.4 , 0.8 , 0.6 ) ( ⊙ 对应元素相乘 ) c_d =B_L⊙\\ m_d = (0.8,0.8,0.8)⊙(0.5,1.0,0.75)\\ = (0.4,0.8,0.6)\\ \quad\\ (⊙对应元素相乘) cd=BL⊙md=(0.8,0.8,0.8)⊙(0.5,1.0,0.75)=(0.4,0.8,0.6)(⊙对应元素相乘)
根据朗伯余弦定律就有了:
c d = m a x ( L ⋅ n , 0 ) ⋅ ( B L ⊙ m d ) c_d =max(L·n,0) ·(B_L⊙m_d) cd=max(L⋅n,0)⋅(BL⊙md)
环境光照
我们不仅要考虑光源的影响,还需要考虑间接光照的影响,比如,太阳光照射到水面,然后水面反射到镜子里,镜子再反射到某个物体上,其实真实世界中,间接光照是很多的,就比如。下方是环境光照的方程:
c a = A L ⊙ m d c_a =A_L⊙m_d ca=AL⊙md
A L A_L AL指定了表面接收到的间接光量(环境光量), m a m_a ma依旧是漫反射率。对于环境光照的计算,是在当前的光照模型中,都按照统一的环境光照计算,并没有进行真实的物理世界的模拟,光照计算,是耗性能的过程。
镜面光照
镜面反射是指光线在平滑表面上的反射,使得反射光线与入射光线在同一平面内,并且入射角等于反射角。
镜面反射通常发生在光线从一个介质进入另一个折射率较小(折射率指介质对光的折射程度)的介质时,比如从空气进入玻璃或水中时。
菲涅尔效应
菲涅尔效应描述了光线从一个介质进入另一个介质时,由于折射率的不同而产生的反射现象。
菲涅尔效应的主要表现是入射光线部分反射和部分折射,即一部分光线通过介质界面进入另一个介质,另一部分光线则反射回原介质。
下图一个由近到远的过程,可以看到近处的石头清晰,远处的石头看不清,因为在远处的石头,几乎不发生折射。
菲涅尔效应的强度取决于入射角、介质的折射率差异以及极化状态等因素。
由于光照过程的复杂性,我们一般不会将完整的菲涅耳方程用于实时渲染,而是采用石里克近似
Schlick approximation)法来代替:
R F ( θ i ) = R F ( 0 ○ ) + ( 1 − R F ( 0 ○ ) ) ( 1 − c o s θ i ) 5 R_F(θ_i) = R_F(0^○) +(1-R_F(0^○))(1-cosθ_i)^5 RF(θi)=RF(0○)+(1−RF(0○))(1−cosθi)5
R F R_F RF是反射光量, 1 − R F ( 0 ○ ) 1-R_F(0^○) 1−RF(0○)是折射光量, R F R_F RF的值是一个RGB的向量,即颜色反应了反射光量。
下面是场景的一些材质对应的属性值:
介质 | R F ( 0 ○ ) R_F(0^○) RF(0○) |
---|---|
水 | (0.02,0.02,0.02) |
玻璃 | (0.08,0.08,0.08) |
塑料 | (0.05,0.05,0.05) |
金 | (1.0,0.71,0.29) |
银 | (0.95,0.93,0.88) |
铜 | (0.95,0.64,0.54) |
表面粗糙度
真实世界的反射物体表面不是理想镜面,而是在微观下具有一定的粗糙度。理想转态下的镜面粗糙度是0,它的宏观与微观的法向方向是相同的,但是真实世界下不是。
我们定义归一化分布函数 ρ ( θ h ) ∈ [ 0 , 1 ] \rho(θ_h)∈[0,1] ρ(θh)∈[0,1],用来表示微观表面法线h与宏观表面法线n之间夹角为 θ h θ_h θh
函数公式:
ρ ( θ h ) = c o s m ( θ h ) = c o s m ( n ⋅ h ) \rho(θ_h)=cos^m(θ_h)=cos^m(n·h) ρ(θh)=cosm(θh)=cosm(n⋅h)
我们将 ρ ( θ h ) \rho(θ_h) ρ(θh)与某种归一化因子进行融合,从而获得基于粗糙度来模拟镜面反射光量的新函数:
S ( θ h ) = m + 8 8 c o s m ( θ h ) = m + 8 8 ( n ⋅ h ) m S(θ_h) = \frac{ m+8}{8}cos^m(θ_h) \\ = \frac{ m+8}{8}(n·h)^m S(θh)=8m+8cosm(θh)=8m+8(n⋅h)m
经过菲涅尔效应计算,镜面反射进入观察者眼的光量为:
C s = m a x ( L ⋅ n , 0 ) ⋅ B L ⊙ R F ( a h ) m + 8 8 ( n ⋅ h ) m C_s=max(L·n,0)·B_L⊙R_F(a_h)\frac{ m+8}{8}(n·h)^m Cs=max(L⋅n,0)⋅BL⊙RF(ah)8m+8(n⋅h)m
可以发现,如果 L ⋅ n ⩽ 0 L·n\leqslant0 L⋅n⩽0那么所计算的结果是射向表面另一侧的光,因此此时正表面不会接收到任何光照。
光照模型
光照模型,是根据光学的有关定律,模拟自然界中光照明的物理过程的计算机模型。
我们所看到的光照,就是各种光的叠加,比如环境光,漫反射光、镜面反射光的叠加,在数学公式上,就这些公式的加法运算。
C o l o r = c a + c d + c s = A L ⊙ m d + m a x ( L ⋅ n , 0 ) ⋅ ( B L ⊙ m d ) + m a x ( L ⋅ n , 0 ) ⋅ B L ⊙ R F m + 8 8 ( n ⋅ h ) m = A L ⊙ m d + m a x ( L ⋅ n , 0 ) ⋅ B L ⊙ ( m d + R F ( a h ) m + 8 8 ( n ⋅ h ) m Color = c_a+c_d + c_s\\ = A_L⊙m_d +max(L·n,0) ·(B_L⊙m_d) + max(L·n,0)·B_L⊙R_F\frac{ m+8}{8}(n·h)^m \\ = A_L⊙m_d +max(L·n,0) ·B_L⊙(m_d +R_F(a_h)\frac{ m+8}{8}(n·h)^m Color=ca+cd+cs=AL⊙md+max(L⋅n,0)⋅(BL⊙md)+max(L⋅n,0)⋅BL⊙RF8m+8(n⋅h)m=AL⊙md+max(L⋅n,0)⋅BL⊙(md+RF(ah)8m+8(n⋅h)m
L L L:指同光源的光同量。
n n n:表面法线。
h h h:列于光向量与观察向量(由表面点指向观察点的单位向量)之间的中间向量。
A L A_L AL:表示入射的环境光量。
B L B_L BL:表示入射的直射光量。
m d m_d md:指示根据表面漫反射率而反射的入射光量。
L ⋅ n L·n L⋅n:朗伯余弦定律。
a h a_h ah:中间向量 h h h与光向量 L L L之间的夹角。
R F ( a h ) R_F(a_h) RF(ah):根据菲涅耳效应,关于中间向量 h h h所反射到观察者眼中的光量。
m:控制表面的粗糙度。
( n ⋅ h ) m (n·h)^m (n⋅h)m:指定法线h与宏观表面法线n之间夹角为B,的所有微平面片段。
\frac{ m+8}{8}:在镜面反射过程中,为模拟能量守恒所采用的归一化因子。
平行光源
平行光源(parallel light)也称方向光源(directional light,也译作定向光源),是一种距离目标物体
极远的光源(每个入射角与照射位置行成的夹角值近似)。因此,我们就可以将这种光源发出的所有入射光看作是彼此平行的光线。(如下图)
点光源
类似于一个灯泡,向四面八方照射。对于任意一点 P P P,光源 Q Q Q所发出的光源总有一束会经过词典,我们定义光向量与传播方向相反,即光向量的方向是由 P P P指向 Q Q Q
L = Q − P ∣ ∣ Q − P ∣ ∣ L=\frac{Q-P}{||Q-P||} L=∣∣Q−P∣∣Q−P
衰减
光强会随着距离的反比例平方而发生衰减,计算公式如下:
I ( d ) = I 0 d 2 I(d)= \frac{I_0}{d^{2}} I(d)=d2I0
I 0 I_0 I0为距离光源d=1处的光强
聚光灯
聚光灯在大于max angle的时候,点就不在灯的照射范围内了
与点光源计算一致,它的光向量:
L = Q − P ∣ ∣ Q − P ∣ ∣ L=\frac{Q-P}{||Q-P||} L=∣∣Q−P∣∣Q−P
聚光灯范围内的所有光线强度也不尽相同,位于Light到Center上的是最强的,也就是最中心的线,其他向量会随着距离中心线的角度变大而变小,而随着角度增加至max angle,光强将逐渐趋近于0。
具体计算与之前类似, k s p o t k_{spot} kspot表示聚光灯因子
k s p o t ( θ ) = m a x ( c o s θ , 0 ) x = m a x ( − L ⋅ d , 0 ) k_{spot}(\theta)=max(cos\theta,0)^x =max(-L·d,0) kspot(θ)=max(cosθ,0)x=max(−L⋅d,0)