games101_光线追踪3
- 本节内容
- 上节回顾
- 辐射度量学·续
- Irradiance(辐照度)
- 用Irradiance解释能量的衰减
- Radiance(辐射)
- Irradiance vs. Radiance
- Bidirectional Reflectance Distribution Function(BRDF,双向反射分布函数)
- 双向反射分布函数(Bidirectional Reflectance Distribution Function,BRDF)
- The Reflection Equation(反射方程)
- Challenge:Recursive Equation(递归公式)
- The Rendering Euqation(渲染方程、绘制方程)
- 渲染方程的理解
- Rendering Equation as Integral Equation
- 举例
- 概率论回顾
本节内容
- 辐射度量学(Radiometry cont. )
- 光线传输(Light transport)
- 反射方程(The reflection equation)
- 渲染方程(The rendering equation)
- 全局光照(Global illumination)
上节回顾
辐射度量学·续
Irradiance(辐照度)
定义:辐照度是每(垂直/投影)单位面积入射到一个表面上一点的辐射通量(功率)。单位:lux,照度(勒克斯)
在计算Irradiance时, 当平面与光线有一定夹角时, 平面没有接收到所有的通量, 需要对最终结果乘以平面与光线夹角的余弦。注意,此处的理解是, 对于最终接收到的通量Flux, 只计算与光线相垂直的面积部分所接收到的通量。
- 左图:单位面积和光线垂直,所以直接用Irradiance的计算式即可
- 中图:面积与光线不垂直,60° 旋转立方体的顶面可获得一半功率,所以要×1/2
- 右图:更普遍的情况,当单位面积与光线不垂直时,要×cos将其投影到垂直的方向上去。
用Irradiance解释能量的衰减
上图中,每个圈所带有的能量都是一致的,不同的是随着半径的增加,每个面上单位面积所带有的能量会逐渐减小。(立体角始终不会变)
根据半径的变化,在单位面积上接受到的能量就是 φ/4πr^2,所以就是r平方的衰减。
Radiance(辐射)
定义: 是指一个表面在每单位立体角、每单位投影面积上所发射(emitted)、反射(reflected)、透射(transmitted)或接收(received)的辐射通量(功率)。
辐射(Radiance)是描述光在环境中的分布的基本场量
- 辐射是与光线有关的量
- 渲染是关于计算辐射的
dA为一个单位面积,该单位面积有自己的方向,所以和入射的光线会有一个夹角θ,然后从这个面往某个方向w上辐射出一些能量。
- 这里的dA是取一块非常小的区域,因为区域小往各个方向辐射的能量就少。
- 定义中有两个”每“,所以这里要做两次微分,其中做θ是面的投影时用到的角度。
- 这里的 cosθ 出现在分母上, 对于Radiance的计算, 只计算投影到垂直于单位立体角的平面的面积部分。
辐射强度(Radiant Intensity)、辐照度(Irradiance)、辐射(Radiance)三者关系:
- 辐射强度(Randiant Intensity):单位立体角的辐射通量
- 辐照度(Irradiance):单位投影面积的辐射通量
- 辐射(Radiance):单位投影面积的辐射强度或者是单位立体角的辐照度(单位立体角、单位投影面积的辐射通量)
入射辐射(Incident Radiance):指到达表面的 单位立体角(dw) 的 辐照度(Irradiance)。即它是沿着给定光线到达表面的光(入射方向指向表面)
出射辐射(Exiting Radiance):离开表面的 单位投影面积(dA) 的 辐射强度(Radiance Intensity)。例如:对于面光(area light),它是沿着给定光线发射的光(出射方向指向表面)
Irradiance vs. Radiance
- Irradiance(辐照度):区域dA接收到的四面八方总共的能量。即在面积dA的总辐射通量
- Radiance(辐射):区域dA接收来自“方向”dw(单位立体角)的能量。即在面积dA 、方向dw 上的辐射通量
- 把半球面上的所有Radiance积分起来得到的就是Irradiance。
注意:iirradiance和Radiance的区别在于radiance具有方向性。他既然可以接受外面的光,同样也可以发射出光,dA往某一个方向辐射出去的能量。
可能会觉得有点绕,那么我来说一说irradiance 和radiance的具体区别(此处可参考此博客):
- irradiance为外面定义的小面积(dA)所接受到的能量是一个总体的
- 而raddiance为一个方向(立体角)进来打到我们定义的小面积(dA)上面的能量
最后用表格列出来,好做对比,该表转载于此博客:
Bidirectional Reflectance Distribution Function(BRDF,双向反射分布函数)
反射: 在之前说过,反射就是一道光线到达一个表面,然后反射到其他的方向去;这个过程其实也可以看作是从某一个方向来的光线到达物体表面后被物体表面所吸收,然后再由物体表面发射到其他方向去。
dE(wi)表示从wi方向射来的radiance到达反射点时被吸收转化得到的Irradiance,即能量会被dA所吸收转化成能量E,然后再从四面八方发射出去,变成radiance。
- 下图是反射点吸收能量时的转化公式(radiance->irradiance):
- 我们知道反射点要吸收来自某一个方向的radiance然后反射到四面八方上去,但是我们不知道反射到某一个wi的方向上会有多少能量。
- 所以我们就定义一个函数,计算出:考虑一个微小的面积dA,从某一个微小的立体角dwi上接受到的Irradiance,会如何被分配到各个立体角上。其实求得就是一个比例,是什么比例?这个比例是对于任何一个立体角上发出去的Radiance / 单位面积接收到的Irradiance,这就是BRDF的定义。它会告诉我们如何把表面上收集到的能量以某一种比例放射到其他的方向上去。
双向反射分布函数(Bidirectional Reflectance Distribution Function,BRDF)
BRDF表示从每个入射方向收集到的能量以某种比例反射到每个出射方向上的能量。
fr是BRDF函数:对于任何一个立体角上发出去的Radiance / 单位面积接收到的Irradiance
某个光线打到物体表面后,就会往不同方向反射的能量分布:
- 如果是镜面反射,那么只有反射方向上会有能量,其他所有方向上都没有能量;
- 如果是漫反射,则表示,这个进来的能量会被均等的分布到各个方向上。
其实BRDF就是描述了光线和物体是如何作用的。正是由于BRDF的这种概念,决定了物体不同的材质到底是怎么一回事,也就是BRDF定义了不同的材质。
The Reflection Equation(反射方程)
从wi角度入射的能量最后反射到wr方向上的能量为dLr(wr)。
而在反射的过程,我们并不是只对来自某一个方向的能量进行反射,而是要将来自四面八方的能量都收集起来,然后反射到某一个角度上,所以要得到最终的反射效果,应该是:
- 通过BRDF计算出每个接受的能量反射到wr方向上的能量
- 然后把这些能量全部累加起来,得到就是wr方向上反射的能量。
其中H的平方表示的积分面积为整个半球面。上面的整个表达式就是反射方程。
Challenge:Recursive Equation(递归公式)
在考虑反射方程的时候,我们要注意到:
- 反射点接受的能量(Irradiance)并不只是来自于光源,还会来自别的表面反射来的光(Irradiance)
- 从反射点反射出去的能量(Radiance)也并不只会反射到Camera或者人眼,还会作为Irradiance反射到其他的面上。
所以反射方程的定义就成了一个递归的定义,也因此,光线反射的次数不同,得到的最终效果也就不会不同。
The Rendering Euqation(渲染方程、绘制方程)
渲染方程很简单,与反射方程相比,渲染方程只是多加了一个自己发光的能量。
因为我们在考虑物体表面对光进行反射的时候,没有考虑物体自己发光的情况,所以渲染方程就加上了物体自身发光的能量。渲染方程如下:
需要注意的是:
- 在这里我们跟blin-phong模型一样,假设所有光线都朝外,比如说上式中wi是从外面打到反射点上的,但在该式子中我们将其写做是向外的。
- 就是说我们考虑所有可能入射来的方向等于是从球心往整个半球上,各个不同的方向上去,半球就写作Ω+或者H²。
- 我们会认为下半球的光是0,因为平面的法线是向上的,如果我们考虑反射,光从下半球打过来这种情况是不可能的,我们会认为共线是0。
- 反射方程和渲染方程的对比:在反射方程中的cos(θi)对应的是渲染方程中的(n · wi)(点乘)。
通过渲染方程这一个方程,我们就可以描述所有的光线传播。
渲染方程的理解
- 下图是只有一个点光源的情况
- 假设我们有很多点光源,那就将所有光源加起来进行计算
- 假设我们有一个面光源,可以理解成面光源是一堆点光源的集合,将其加起来。
将面光源上任意一个点的共线积分起来,道理是一样的。所以就积分这个面光源所占的立体角,考虑它所有覆盖的方向,从这个方向来的radiance,经过BRDF,反射过去,应该是什么样子的radiance出去。 - 假设除了面光源还有其他面的光源反射到点x的radiance。
我们将入射Radiance替换为来自场景中其他曲面的反射Radiance:场景中其他曲面的出射光线就是接收平面的入射光线,所以渲染方程中的积分项是Lr,由于是出射方向,wi相较于反射方程,矢量方向是负的。注意,这一过程是递归的。
wi为什么要加负号: radiance的方向都是出射方向,这里的-wi是相对于x‘的出射方向。这里的入射角度为了方便函数计算都是规定为从反射点朝外的,但是这里的入射角作为另一个点的出射角是从外射向当前点的,所以正好相反,这里加一个符号就可以直接递归了。
Rendering Equation as Integral Equation
上图上面的式子在数学上的简单表达方式为上图下面的等式。
- I(u):位置u发出的Radiance;
- e(u):着色点v自己发出的能量e(u);
- K(u,v)dv:表示了能量分布(方程核);
- I(v):位置v反射的Radiance。(别的物体发出的radiance反射到该点上的能量)
甚至还能将I(u)方程式继续简写:
L = E + KL可以变为下列方程式(IL中的I表示的是单位矩阵),其中I是单位矩阵:
通过类似泰勒展开的形式,可得如下表达式,K的指数表示光线反射的次数:
则每一项可以依次理解为光源发射的能量:
分解成直接看到光源会看到什么,加上光源辐射出来的能量经过一次反射之后会看到什么,加上光源辐射出来的能量经过两次反射之后会看到什么…
- E,常数项,自身光源发出的光
- KE,一次项,光源直接照射着色点,直接光照,光发生一次弹射
- K²E,二次项,间接光照,光发生两次弹射
…
所以全局光照可以理解为直接光照和间接光照的集合。
从另一个角度理解这个式子:
光栅化能够告诉我们光线传播的内容其实就只有零次和一次,即光源自己以及直接光照部分。后面的部分光栅化也可以做,但是处理起来比较麻烦。
举例
不管光源是什么样的,打得到的就是亮的,没打到光的就是黑的,比如人走在走廊下面,光线沿直线传播,那光一定不会打到走廊上方,也有就是图右上方黑色的区域包括p点,下图就是直接光照能得到的一个结果。
下图是一次间接光照,也就是光弹射两次部分引起的间接光照,加入直接光照之后的效果。也就是现在是 直接光照+间接光照。
下图是光线再多弹射一次,光线在场景中弹射三次(两次更多的间接光照)
光线弹射五次:
注意:这里灯不是随便亮起来的。玻璃本身是双层的,光线经过两次弹射只能进去,只有再经过两次弹射它才能出来。所以在最后一张图灯才亮起来。
随着光线弹射的次数越多,结果最后会收敛,亮度会趋近一个值。
概率论回顾
如果是离散的值:
随机变量的期望值:
E[X]——数学期望,等于所有 概率与其值乘积 的总和。
如果是连续的值:
概率密度函数(PDF):
任何一个点x,在其周围取一个dx的范围,然后从dx的左边界右边界往上连线,会与连续的曲线相连,形成一个区域,或者说形成一个梯形区域,该区域就是概率。