games101:八,辐射度量学+BRDF和渲染方程概念导论+蒙特卡罗积分法、路径追踪法

一,辐射度量学

在光线追踪中,之前一直用一个数代表光的强度,但实际中光是有测量单位的;whited-style模型中也有缺陷,比如没有反映出漫反射光线、Blinn-Phong模型是个经验模型有误差等。这些情况导致光线追踪效果与真实不一致,辐射度量学可以解决这些问题。(真的吗?mark待验证)

1.1 辐射能量(Radiant energy)与辐射通量(Radiant flux/power)

  • 辐射能量为辐射电磁能量,符号Q,单位焦耳J
  • 辐射通量也叫辐射功率,表示单位时间内的辐射能量,一定情况下可以表示亮度,符号Φ=dQ/dt,单位瓦W(类比灯泡)或者流明lm(类比投影)

1.2 辐射强度(Radiant intensity)

  • 3个近似概念:

    1. Radiant intensity指从一个光源向四周散发出去的能量
    2. Irradiance指一个物体一点表面接收到的能量
    3. Radiance指一条光线传播过程中的能量(与方向无关)
  • 辐射强度指每单位立体角(solid angle)上的功率(光源出发),符号 I = d Φ d w I = \frac{dΦ}{dw} I=dwdΦ,单位
    W s r \frac{W}{sr} srW(按瓦计算)或者 l m s r = c d = c a n d e l a \frac{lm}{sr}=cd=candela srlm=cd=candela(按流明计算)

  • 弧度和立体角(三维弧度):

    1. 弧度 = 弧长 半径 \frac{弧长}{半径} 半径弧长;范围0~2π;
    2. 立体角 = 球表面积 半 径 2 \frac{球表面积}{半径^2} 2球表面积;范围0~4π;
      在这里插入图片描述
  • 微分立体角:同极坐标微分---- d w = d A r 2 = s i n θ d θ d φ dw = \frac{dA}{r^2} = sinθdθdφ dw=r2dA=sinθdθdφ

  • 因此点光源的辐射强度 I = d Φ d w = Φ 4 π I = \frac{dΦ}{dw} = \frac{Φ}{4π} I=dwdΦ=4πΦ

1.3 辐射照度(Radiant irradiance)

  • 辐射照度指辐射通量密度,即单位垂直面积上的功率(接收面),符号为 E = d Φ d A E = \frac{dΦ}{dA} E=dAdΦ,单位为 W m 2 = l u x \frac{W}{m^2} = lux m2W=lux
  • 正因为辐射照度定义为垂直于光线的面积(或投影到垂直方向),因此在不垂直的面上计算的面积为 A c o s θ \frac{A}{cosθ} cosθA----即为 E = Φ A c o s θ E = \frac{Φ}{A}cosθ E=AΦcosθ--------Blinn-Phong中的Lambert’s Cosine Law「这里理解为取光线垂直于照射面的分量更好理解,如下图」
  • 光照模型中说过光源越远约衰减,实际上衰减的不是intensity(立体角没变),衰减的是irradiance,因为面积~ r 2 r^2 r2

在这里插入图片描述

1.4 辐射亮度(Radiant radiance)

  • 辐射亮度指一条光线在传播过程中,单位垂直投影面积(与入射角夹角θ)、单位立体角上的功率,符号为 L ( p , w ) = d 2 Φ ( p , w ) d w d A c o s θ = d E ( p ) d w c o s θ L(p,w) = \frac{d^2Φ(p,w)}{dwdAcosθ} = \frac{dE(p)}{dwcosθ} L(p,w)=dwdAcosθd2Φ(p,w)=dwcosθdE(p),单位为 W s r − m 2 \frac{W}{sr-m^2} srm2W或者 c d m 2 = n i t \frac{cd}{m^2} = nit m2cd=nit
  • 公式里乘上cosθ可以理解为单位角dw代表的方向在照射面积垂直方向上投影的分量
  • radiance和irradiance的关系可以用公式推导出来,主要区别在于radiance具有方向性,irradiance是面积上所有方向的power集合,有积分关系如下:
    在这里插入图片描述

二,双向反射分布函数BRDF(Bidirectional Reflectance Distribution Function)和渲染方程

2.1 BRDF

本理论是基于物理渲染的基础,在学习了radiance和irradiance之后可以把反射的过程理解为:物体表面接收了从ω方向来的光线 d E ( ω i ) dE(ω_i) dE(ωi)后,再把它发射到不同方向去 d L r ( x , ω r ) dL_r(x,ω_r) dLr(x,ωr),根据材质不同,发射的方向和亮度不同;在理想光滑表面上反射光只有镜面反射方向有,在理想粗糙表面上反射光为所有方向。BRDF就是描述材质----一个表面接受光线后如何分配各方向反射光线的函数。

  • BRDF定义:出射radiance与入射irradiance微分的比「实际应用中,接收光线是来自各个角度的光线或其他反射光线的集合(同whitted-style),在空间角中积分和递归,还是比较难算的」

在这里插入图片描述

扫描二维码关注公众号,回复: 14630990 查看本文章
  • 渲染方程:发射光=自身发光+接受光,cos用点积代替(假设所有方向都朝外)
    L o ( p , w o ) = L e ( p , w o ) + ∫ Ω + L i ( p , w i ) f r ( p , w i , w o ) ( n ⋅ w ) d w i L_o(p,w_o) = L_e(p,w_o) + \int_{\Omega+}L_i(p,w_i)f_r(p,w_i,w_o)(n\cdot w)dw_i Lo(p,wo)=Le(p,wo)+Ω+Li(p,wi)fr(p,wi,wo)(nw)dwi

2.2 渲染方程

上式渲染方程可以改写成下式
在这里插入图片描述
再改写为线性代数形式,K为算子操作(这里看不懂,mark)
在这里插入图片描述
化简
在这里插入图片描述
最后化简为
L = E + K E + K 2 E + K 3 E + … … L = E + KE + K^2E + K^3E+…… L=E+KE+K2E+K3E+……

  • 其物理意义:
    1. E为直接从该物体发出的光源
    2. KE为光源经过该物体一次反射(弹射一次)「到这一步是着色能做到的,之后就不好做到」
    3. K^2E为已经经过反射或折射的光经过该物体一次反射(弹射两次)
    4. ……(弹射多次)

计算越多弹射次数越接近真实情况(对于玻璃罩等的情况,至少算3-4次才能从罩子出去)

三,蒙特卡罗方法(Monte Carlo method)

蒙特卡罗方法也称统计模拟方法,是指使用随机数(或更常见的伪随机数)来解决很多计算问题的方法,相关的方法有:蒙特卡罗算法,蒙特卡罗模拟,蒙特卡罗过程,蒙特卡罗搜索树—AlphaGO以及蒙特卡罗积分法。蒙特卡洛积分是图形学里常用的数值方法,无论BRDF方程,还是PCF阴影滤波都会用到。

3.1 蒙特卡罗积分法(Monte Carlo Integration)

当一个函数f(x)难积分时,可用蒙特卡罗方法:在区间内随机取若干点,计算若干点的函数平均值,再乘以区间(b-a)以近似求出函数积分。如下图:
在这里插入图片描述
上述过程用数学表达为:
S = 1 4 ( b − a ) ∑ i = 1 4 f ( x i ) S = \frac{1}{4}(b-a)\sum_{i=1}^4 f(x_i) S=41(ba)i=14f(xi)

上面是普通随机采样的例子,对于其他一般情况:
I = ∫ a b f ( x ) d x = ∫ a b f ( x ) p ( x ) p ( x ) d x = ∫ a b g ( x ) p ( x ) d x = > { g ( x ) = f ( x ) p ( x ) } I = \int_a^b f(x)dx = \int_a^b \frac{f(x)}{p(x)}p(x)dx = \int_a^b g(x)p(x)dx => \{g(x) = \frac{f(x)}{p(x)}\} I=abf(x)dx=abp(x)f(x)p(x)dx=abg(x)p(x)dx=>{ g(x)=p(x)f(x)}
由期望~均值关系得
I = ∫ a b g ( x ) p ( x ) d x = E [ g ( x ) ] = 1 N ∑ i = 1 N g ( x i ) = ∫ a b f ( x ) d x I = \int_a^b g(x)p(x)dx = E[g(x)] = \frac{1}{N}\sum_{i=1}^N g(x_i) = \int_a^b f(x)dx I=abg(x)p(x)dx=E[g(x)]=N1i=1Ng(xi)=abf(x)dx
所以
I = 1 N ∑ i = 1 N g ( x i ) = 1 N ∑ i = 1 N f ( x ) p ( x ) I = \frac{1}{N}\sum_{i=1}^N g(x_i) = \frac{1}{N}\sum_{i=1}^N \frac{f(x)}{p(x)} I=N1i=1Ng(xi)=N1i=1Np(x)f(x)

3.2 蒙特卡罗路径追踪(Monte Carlo Path[pɑːθ] Tracing)

路径追踪可以解决Whitted-Style光线追踪的缺陷,即漫反射等难以计算,渲染结果缺乏真实感。

回顾2.2节的渲染方程:
L o ( p , w o ) = L e ( p , w o ) + ∫ Ω + L i ( p , w i ) f r ( p , w i , w o ) ( n ⋅ w ) d w i L_o(p,w_o) = L_e(p,w_o) + \int_{\Omega+}L_i(p,w_i)f_r(p,w_i,w_o)(n\cdot w)dw_i Lo(p,wo)=Le(p,wo)+Ω+Li(p,wi)fr(p,wi,wo)(nw)dwi
该渲染方程的计算有两个难点:半球上的积分计算和递归计算。但方程的结果是个积分,也就是一个值,合理想到蒙特卡罗方法估计积分结果!

3.2.1 光照计算过程

先假设一个简单光照场景,光线直接打到Q点后反射到P点,计算P点接收Q点反射光后的反射光:
在这里插入图片描述

省略方程发光项: L o ( p , w o ) = ∫ Ω + L i ( p , w i ) f r ( p , w i , w o ) ( n ⋅ w ) d w i L_o(p,w_o) = \int_{\Omega+}L_i(p,w_i)f_r(p,w_i,w_o)(n\cdot w)dw_i Lo(p,wo)=Ω+Li(p,wi)fr(p,wi,wo)(nw)dwi,此时使用蒙特卡罗积分法对 w i w_i wi进行采样,设 w i ∼ p ( w i ) = 1 2 π w_i \sim p(w_i) = \frac{1}{2π} wip(wi)=2π1,带入公式得:
L o ( p , w o ) ≈ 1 N ∑ i = 1 N f ( x ) p ( x ) = 1 N ∑ i = 1 N L i ( p , w i ) f r ( p , w i , w o ) ( n ⋅ w ) p ( w i ) L_o(p,w_o) \approx \frac{1}{N}\sum_{i=1}^N \frac{f(x)}{p(x)} = \frac{1}{N}\sum_{i=1}^N \frac{ L_i(p,w_i)f_r(p,w_i,w_o)(n\cdot w)}{p(w_i)} Lo(p,wo)N1i=1Np(x)f(x)=N1i=1Np(wi)Li(p,wi)fr(p,wi,wo)(nw)
「注意分子的p是p点,分母的 p ( w i ) p(w_i) p(wi)是概率分布函数」

计算过程伪代码:
在这里插入图片描述

3.2.2 存在的两个问题

目前算出了直接和间接光照的结果,但还存在两个问题:

  1. 如此递归光线数量指数上升、计算量爆炸。
  2. 递归停止条件呢?

问题一:N的取值

我们观察公式发现只有N=1的时候才不会出现指数爆炸----用N=1做蒙特卡罗积分计算光线就叫路径追踪;用N!=1就是分布式追踪(用得少)

伪代码如下:
在这里插入图片描述
但都知道N=1采样偏差大,为解决这个问题,采用N=1每次只追踪一个路径但多次追踪计算平均值的方法,改良后伪代码如下:
在这里插入图片描述

问题二:递归停止条件----俄罗斯轮盘赌(Russian Roulette)

公式里没有给出递归停止条件,因此递归停不下来,那如何设置递归停止条件呢?

如果像光线追踪中设置最大反射次数来限制递归,也不符合实际,因为现实生活中就是反射无限次的。

因此人们引入一种方法,俄罗斯轮盘赌(RR),来计算一个停止递归的概率。

俄罗斯轮盘赌原本指一把左轮两发子弹,拿这把左轮射自己有4/6的概率活下来(这不就是二项式吗?)。套用到我们这里,指设定光线会继续递归下去的概率为P,停止递归概率为1-P;递归时返回 L o P \frac{L_o}{P} PLo,不递归时返回0;这时期望还是 L o L_o Lo。如下图:

在这里插入图片描述
伪代码如下:(概率P_RR)----有了递归停止条件
在这里插入图片描述
到这里,2个问题都解决后,就已经是一个正确的路径追踪的方法了。就是还有一个效率不是很高的小问题

3.2.3 效率太低问题----直接光源和间接光源分开计算

如果每像素打出的光线(SPP----samples per pixel)不够多,就会产生很多噪点,这是因为有很多打出的光线都打不到光源上,是无效的。为了提高打出光线的效率,这里使用了在有光源下,直接对光源积分的方法,具体如下图:
在这里插入图片描述
不同的pdf可以控制不同的光线打出概率,为了直接对光源积分我们使用 1 A \frac{1}{A} A1作为pdf值,其中A是光源面积,然后对A积分;但原本的公式是对立体角 w i w_i wi积分的,因此需要找到A和 w i w_i wi之间的关系,如下式:
d w = d A c o s θ ′ [ d i s ( x , x ′ ) ] 2 dw = \frac{dA cosθ'}{[dis(x,x')]^2} dw=[dis(x,x)]2dAcosθ
其中θ’是光源法向量与光源和采样点连线的夹角。

改变积分域后公式变为:
L o ( x , w o ) = ∫ Ω + L i ( x , w i ) f r ( x , w i , w o ) c o s θ c o s θ ′ [ d i s ( x , x ′ ) ] 2 d A L_o(x,w_o) = \int_{\Omega+}L_i(x,w_i)f_r(x,w_i,w_o)\frac{cosθcosθ'}{[dis(x,x')]^2}dA Lo(x,wo)=Ω+Li(x,wi)fr(x,wi,wo)[dis(x,x)]2cosθcosθdA
= A N ∑ i = 1 N L i ( p , w i ) f r ( p , w i , w o ) c o s θ c o s θ ′ [ d i s ( x , x ′ ) ] 2 = \frac{A}{N}\sum_{i=1}^N L_i(p,w_i)f_r(p,w_i,w_o)\frac{cosθcosθ'}{[dis(x,x')]^2} =NAi=1NLi(p,wi)fr(p,wi,wo)[dis(x,x)]2cosθcosθ

这样对直接光源的情况可以大大提高采样效率,而对间接光源有层层弹射的部分我们还采用上面得到的RR方式,可避免在概率采样的方式下直接光源部分产生太大误差。

伪代码:
在这里插入图片描述
其中直接光源部分还需判断是否有遮挡
在这里插入图片描述
以上就是所有本节的路径追踪知识!

tip:

  • 点光源对路径追踪来说比较难处理,可以看做一个很小的面光源
  • 本节逻辑有点混乱,老师课程逻辑就是这样,感觉应该在找到其他参考资料在此学习一遍

知识拓展:

  • 路径追踪是照片级的正确哈欣慰,渲染和照片对比请看康奈尔的网站http://www.graphics.cornell.edu/online/box/compare.html
  • 如何在半球或面积上实现均匀采样,见作业7
  • 蒙特卡洛积分时应该怎么选择pdf呢(除了均匀采样外)?----重要性采样理论「或是attention机制」
  • 采样生成的随机数也有质量区分,其中低差异化序列(low discrepancy sequences)质量比较好(均匀、距离分布等)
  • 把上述直接光源和间接光源的采样方法结合起来的方法----MIS(multiple importance sampling)
  • 我们目前是在一个像素里把所有方向的采样结果计算平均值,但在像素里中心和边缘有没有加权呢?----pixel reconstruction filter
  • 计算出来每个像素的radiance怎么换算成应该显示的颜色呢?----Gamma矫正、曲线、颜色空间

猜你喜欢

转载自blog.csdn.net/yx314636922/article/details/122257617