【实时渲染】菲涅尔反射率

《Real Time Rendering 4th》9.5 章读书笔记

经典的折射和反射定律

光通过两个不同介质的界面的时候,会发生反射和折射现象。反射是指光从另一个路径离开界面,折射是指光通过界面进入了另一种介质中。其中满足条件:

  1. 反射角等于入射角
  2. 折射角与入射角满足斯涅尔定律

s i n θ 1 s i n θ 2 = n 2 n 1 \frac{sin\theta_1}{sin\theta_2} = \frac{n2}{n1} sinθ2sinθ1=n1n2

其中 n1, n2 是两个介质的折射率

菲涅尔公式

入射光的电场振动方向可以取与光的传播方向垂直的任意方向。我们可以将电矢量分解为与光的入射面(入射界面法线与光线构成的面)垂直和平行的两个分量,并分别记为 Es (垂直)和 Ep (平行)。

在这里插入图片描述

根据电磁场的边值关系我们可以得到关于这两个分矢量在反射,折射中与入射时的比值关系:
r s = A 1 s ′ A 1 s = − s i n ( θ 1 − θ 2 ) s i n ( θ 1 + θ 2 )   t s = A 2 s A 1 s = 2 s i n θ 2 c o s θ 1 s i n ( θ 1 + θ 2 )   r p = A 1 p ′ A 1 p = t a n ( θ 1 − θ 2 ) t a n ( θ 1 + θ 2 )   t p = A 2 p A 1 p = 2 s i n θ 2 c o s θ 1 s i n ( θ 1 + θ 2 ) c o s ( θ 1 − θ 2 )   \begin{aligned} r_s & = \frac{A'_{1s}}{A_{1s}}=-\frac{sin(\theta_1-\theta_2)}{sin(\theta_1+\theta_2)}\\\ \\ t_s & = \frac{A_{2s}}{A_{1s}}=\frac{2sin\theta_2cos\theta_1}{sin(\theta_1+\theta_2)}\\\ \\ r_p & = \frac{A'_{1p}}{A_{1p}}=\frac{tan(\theta_1-\theta_2)}{tan(\theta_1+\theta_2)}\\\ \\ t_p & = \frac{A_{2p}}{A_{1p}}=\frac{2sin\theta_2cos\theta_1}{sin(\theta_1+\theta_2)cos(\theta_1-\theta_2)}\\\ \\ \end{aligned} rs ts rp tp =A1sA1s=sin(θ1+θ2)sin(θ1θ2)=A1sA2s=sin(θ1+θ2)2sinθ2cosθ1=A1pA1p=tan(θ1+θ2)tan(θ1θ2)=A1pA2p=sin(θ1+θ2)cos(θ1θ2)2sinθ2cosθ1

其中:

  • rs :s 波的反射系数
  • ts :s 波的透射系数
  • rp :p 波的反射系数
  • tp :p 波的透射系数
  • A :对应电矢量的振幅

这四个公式合称 菲涅公式,它描述了两件事情:

  1. 入射光的电矢量的两个分量,即 sp 在发生反射和折射时,能量的再分布规律不同
  2. 两个电矢量分量在发生反射和折射时,其振幅与入射时的振幅之比满足以上关系

当入射角很小的时候,有:
t a n θ ≈ s i n θ ≈ θ   s i n θ 1 s i n θ 2 ≈ θ 1 θ 2 ≈ n 2 n 1 = n tan\theta\approx sin\theta\approx\theta\\\ \\ \frac{sin\theta_1}{sin\theta_2}\approx\frac{\theta_1}{\theta_2}\approx \frac{n2}{n1} = n tanθsinθθ sinθ2sinθ1θ2θ1n1n2=n
于是得到菲涅尔公式在接近垂直入射的情况下的近似公式:
r s = − n − 1 n + 1   t s = 2 n + 1   r p = n − 1 n + 1   t p = 2 n + 1   \begin{aligned} r_s & =-\frac{n-1}{n+1}\\\ \\ t_s & =\frac{2}{n+1}\\\ \\ r_p & =\frac{n-1}{n+1}\\\ \\ t_p & =\frac{2}{n+1}\\\ \\ \end{aligned} rs ts rp tp =n+1n1=n+12=n+1n1=n+12
根据菲涅尔公式可以得到一个很重要的物理结论,就是当入射光是从光疏介质进入光密介质(n1 < n2)时,在入射角很小的情况下会发生反射部分发生“半波损失”。但对渲染更重要的是关心反射光,透射光和入射光的能量占比,其中反射能量和入射能量的比值称为反射率,而透射部分与入射部分的能量比值称为透射率,这些都可以从菲涅尔公式推导出来的:

R = A 1 ′ 2 A 1 2   T = n 2 c o s θ 2 n 1 c o s θ 1 A 2 2 A 1 2 = n ⋅ c o s θ 2 c o s θ 1 A 2 2 A 1 2 \begin{aligned} R &= \frac{A'^2_1}{A^2_1}\\\ \\ T &= \frac{n2cos\theta_2}{n1cos\theta_1}\frac{A_2^2}{A_1^2} = n\cdot\frac{cos\theta_2}{cos\theta_1}\frac{A_2^2}{A_1^2} \end{aligned} R T=A12A12=n1cosθ1n2cosθ2A12A22=ncosθ1cosθ2A12A22
其中:

  • R:反射率
  • T:透射率

并且根据能量守恒定律有:
R + T = 1 R+T=1 R+T=1

将菲涅公式带入反射率和透射率方程,可以得到 s 波和 p 波的反射率和透射率。

R s = A 1 s ′ A 1 s = s i n 2 ( θ 1 − θ 2 ) s i n 2 ( θ 1 + θ 2 )   T s = n 2 c o s θ 2 n 1 c o s θ 1 ( A 2 s A 1 s ) 2 = n 2 c o s θ 2 n 1 c o s θ 1 4 s i n 2 θ 2 c o s 2 θ 1 s i n 2 ( θ 1 + θ 2 )   R p = A 1 p ′ A 1 p = t a n 2 ( θ 1 − θ 2 ) t a n 2 ( θ 1 + θ 2 )   T p = n 2 c o s θ 2 n 1 c o s θ 1 ( A 2 p A 1 p ) 2 = n 2 c o s θ 2 n 1 c o s θ 1 4 s i n 2 θ 2 c o s 2 θ 1 s i n 2 ( θ 1 + θ 2 ) c o s 2 ( θ 1 − θ 2 )   \begin{aligned} R_s&=\frac{A'_{1s}}{A_{1s}}=\frac{sin^2(\theta_1-\theta_2)}{sin^2(\theta_1+\theta_2)}\\\ \\ T_s&=\frac{n_2cos\theta_2}{n1cos\theta_1}(\frac{A_{2s}}{A_{1s}})^2=\frac{n2cos\theta_2}{n1cos\theta_1}\frac{4sin^2\theta_2cos^2\theta_1}{sin^2(\theta_1+\theta_2)}\\\ \\ R_p&=\frac{A'_{1p}}{A_{1p}}=\frac{tan^2(\theta_1-\theta_2)}{tan^2(\theta_1+\theta_2)}\\\ \\ T_p&=\frac{n_2cos\theta_2}{n1cos\theta_1}(\frac{A_{2p}}{A_{1p}})^2=\frac{n2cos\theta_2}{n1cos\theta_1}\frac{4sin^2\theta_2cos^2\theta_1}{sin^2(\theta_1+\theta_2)cos^2(\theta_1-\theta_2)}\\\ \\ \end{aligned} Rs Ts Rp Tp =A1sA1s=sin2(θ1+θ2)sin2(θ1θ2)=n1cosθ1n2cosθ2(A1sA2s)2=n1cosθ1n2cosθ2sin2(θ1+θ2)4sin2θ2cos2θ1=A1pA1p=tan2(θ1+θ2)tan2(θ1θ2)=n1cosθ1n2cosθ2(A1pA2p)2=n1cosθ1n2cosθ2sin2(θ1+θ2)cos2(θ1θ2)4sin2θ2cos2θ1

两个波的反射率和透射率又分别满足能量守恒定律:
R s + T s = 1 ,   R p + T p = 1 R_s + T_s=1,\ R_p+T_p=1 Rs+Ts=1, Rp+Tp=1

对于自然光,s 波和 p 波的能量相等,可以得到自然光的反射率:
R n = 1 2 ( R s + R p ) = 1 2 [ s i n 2 ( θ 1 − θ 2 ) s i n 2 ( θ 1 + θ 2 ) + t a n 2 ( θ 1 − θ 2 ) t a n ( θ 1 + θ 2 ) ] \begin{aligned} R_n &= \frac{1}{2}(R_s+R_p)\\ &=\frac{1}{2}[\frac{sin^2(\theta_1-\theta_2)}{sin^2(\theta_1+\theta_2)}+\frac{tan^2(\theta_1-\theta_2)}{tan^(\theta_1+\theta_2)}] \end{aligned} Rn=21(Rs+Rp)=21[sin2(θ1+θ2)sin2(θ1θ2)+tan(θ1+θ2)tan2(θ1θ2)]

当入射角很小的时候,有:
R n = ( n − 1 n + 1 ) 2 R_n = (\frac{n-1}{n+1})^2 Rn=(n+1n1)2

在《Real Time Rendering 4th》中,这个值被记作 F0,即接近0°入射角时的菲涅尔反射率。当入射角等于90°时,透射率为0,反射率为1。从0°增大到90°的过程中,反射率的变化规律随不同材料,不同波长的光而有所不同。

一个很有趣的事情是,对于不导电的介质而言,它的反射率变化几乎与光波无关,正如左下图所示。而对于良导体,例如金属而言,不同波长的光的反射率变化有较大区别,甚至不是单调的。这与金属的特性有关,即金属中存在大量的自由电子,且这些自由电子一般只分布在金属表面上。这些自由电子在表面层形成表层电流,而金属内部电荷体密度为0。

这两个性质影响着电磁场的边值关系,从而也影响着菲涅尔公式的推导。依赖新的边值关系我们可以得出只有当赋予金属一个复折射率才可以将绝缘介质中得到的折射和反射方程搬到金属这里来。然而,金属这个复折射率还依赖于光的频率,所以对于不同波长的光,它在金属表面的反射特性就表现得不同。也正是因为如此,在渲染中我们可以用一个数字为一个绝缘体指定反射率,但是需要三个数字(RGB)来为金属指定反射率。

在这里插入图片描述

上图分别描绘了从空气进入:玻璃,铜,铝三种材料的反射率变化规律。下图则截取了红绿蓝三原色的截面。可以看出,因为铜的红光反射率很高,所以铜表面呈现偏红的色泽,而铝对于不同波长的光的反射率区别比较小,所以表面呈白色/银色。

实际渲染中,我们无法直接计算这么负责的反射率方程,所以书中给出了简化的版本,同时考虑到人眼的透视效应,自变量从入射角折射角的θ,变成了法线 n 和 入射矢量 l
F ( n , l ) ≈ F 0 + ( 1 − F 0 ) ( 1 − ( n , l ) + ) 5 F(\textbf{n},\textbf{l})\approx F_0 + (1 - F_0)(1-(\textbf{n},\textbf{l})^+)^5 F(n,l)F0+(1F0)(1(n,l)+)5

或者,还提出,在某些程序中会使用以下更通用的版本:
F ( n , l ) ≈ F 0 + ( F 90 − F 0 ) ( 1 − ( n , l ) + ) 1 p F(\textbf{n},\textbf{l})\approx F_0 + (F_{90} - F_0)(1-(\textbf{n},\textbf{l})^+)^{\frac{1}{p}} F(n,l)F0+(F90F0)(1(n,l)+)p1
这个式子不同的地方在于,F90 可以不为1,用来处理一些菲涅尔方程不能很好地进行描述的材料。

  • 13
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
菲涅尔反射系数是描述光线从介质A射向介质B时,发生反射和折射的现象的物理量。在光的折射和反射中,菲涅尔反射系数用于描述光的入射波和反射波之间的关系。 Matlab是一种常用的科学计算和数据可视化工具,可以用来计算菲涅尔反射系数。我们可以利用Matlab中的物理光学库或者自定义函数来计算菲涅尔反射系数。 首先,我们需要确定介质A和介质B的折射率nA和nB。然后根据入射角度和折射角度的关系,可以使用Fresnel公式计算出垂直入射光的反射系数。 具体计算步骤如下: 1. 在Matlab中定义介质A和介质B的折射率nA和nB。 2. 输入入射角度θ,可以使用matlab函数sind和cosd将角度转换为弧度。 3. 根据Fresnel公式计算反射系数: - 入射波的振幅反射系数r_perpendicular = (nA * cos(θ) - nB * sqrt(1 - (nA/nB)^2 * sind(θ)^2)) / (nA * cos(θ) + nB * sqrt(1 - (nA/nB)^2 * sind(θ)^2)) - 入射波的振幅透射系数t_perpendicular = (2 * nA * cos(θ)) / (nA * cos(θ) + nB * sqrt(1 - (nA/nB)^2 * sind(θ)^2)) 4. 计算垂直入射光的反射系数R = r_perpendicular^2 和透射系数T = t_perpendicular^2。 通过以上步骤,我们可以得到菲涅尔反射系数R和透射系数T。在Matlab中,我们可以输入不同的折射率和入射角度,计算不同介质间的反射系数。 此外,我们还可以使用Matlab绘制出折射率和反射系数之间的关系图,以更好地理解光在不同介质中的传播过程。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值