写在前面:原始文案来源于凌风同学博客,本文在其基础上增加图片并对文案稍作修改。此系列文章已经私信咨询能否授权发布,但一直尚未得到本人回复。出于工作要求,本人需要记录该系列课程体系,以供后期交流学习使用,不得已在此公开。特在此严谨声明,该系列文章不以盈利为目的,侵权麻烦私信即可删除。
第十五讲目录
Lecture 15 Ray Tracing 3(Radiometry)
–-即将接触的新术语:
辐射通量(Radiant flux)
光照强度(intensity)
辐照度(irradiance)
辐射度(radiance)
一.Radiant Energy and Flux(辐射能和通量) (Power)
(一).Radiant energy(辐射能)
定义:辐射能是电磁辐射的能量。它以焦耳为单位进行测量,并用以下符号表示:
类似于功的概念,可以理解为总的能量:灯泡一共散发多少热量/散发多少光能
(二).Radiant flux(辐射通量)
定义:辐射通量(功率)是单位时间内发射、反射或接收的能量
类似于功率的概念,可以理解为单位时间的能量:灯泡在单位时间内散发多少热量/散发多少光能
同时功率的单位还可以是lm(流明),可以理解为表示的是光的亮度。
这个概念还可以这样理解:如上图,假设前面有一个感光的平面,那么某一时刻通过这个平面的光子数量,即为Radiant flux。
二.Important Light Measurements of Interest
(一).Radiant Intensity(光照强度)
一个光源会向各个方向辐射能量,在这里定义Radiant Intensity,表示沿某个立体角方向上辐射的能量。理解为单位立体角上光辐射的能量:灯泡在单位时间内单位角度上散发多少热量/散发多少光能
Radiant Intensity (光照强度I(w))可由以下公式计算:
- I(w)光照高度 单位:cd
- w:立体角 单位:sr
- φ:辐射通量 单位:W(瓦)或lm(流明)
那么什么是立体角?
在二维上来讲,用弧度来定义一个角,弧度=弧长/半径,整个圆的弧度是2π
在三维上,用立体角来定义和二维中弧度类似的概念(相当于是用弧度表示角度的概念在三维中的延伸)。在三维空间中,从球心出发,向球的表面,形成某个锥,这个锥会打到球面上,形成某一块面积,立体角=面积/半径的平方。
整个球面的立体角也可以类似去积分,是4π
1.Differential Solid Angles(单位立体角)
如果把这个球看成一个经纬球,那么用θ表示经度方向的角度,用φ表示纬度方向的角度,那么就可以定义球上唯一一点的位置(球坐标系)。
那么通过微积分就可以求出单位立体角:
先将单位面积积分出来,再通过立体角的定义求出单位立体角:
我们还可以求出整个球的单位立体角,是4π
我们可以用单位立体角去表示单位长度(单位球)上的任意一个方向。也就是说发光球体任意方向的光照强度I= 辐射通量 / 球体立体角4π
例子:将发光的灯泡想象成球体,辐射通量是815lm。那么他在任一方向上的光照强度就是815/4π≈65cd
2.Isotropic Point Source(各向同性点光源)
知道了什么是立体角,回到刚刚的光照强度Radiant Intensity问题上来,我们定义一个点光源,那么光照强度Radiant Intensity其实就是任意一个光源在任何一个方向上的亮度:
把所有单位立体角上的光照强度Radiant Intensit积分起来同样还可以得到辐射通量flux(power)
(二).Irradiance辐照度
各个方向的光照射到一小块面积上的能量(单位面积上接收到的各个方向的光辐射的能量)。
这里的辐照度Irradiance必须是垂直于光线的面积,或者说投影到垂直方向上的有效面积。
所以以前的一些问题就可以得到解决:
1.Lambert’s Cosine Law
表面辐照度与光方向与表面法线之间角度的余弦成正比,与布林冯模型类比
2.Correction: Irradiance Falloff
(三)Radiance辐射度
辐射度(Radiance)是描述环境中光分布的基本场量,用来描述光线的属性。
定义:辐射度(亮度)是每单位立体角,每个投影单位面发射、反射、发射或接收的功率
刚刚提到了光照强度是沿某个立体角方向上辐射的能量,辐照度是各个方向的光照射到一小块面积上的能量,那么把两者结合起来理解,即为光在某个单位面积上,朝某个方向辐射或接收的能量。
比如一小块面积dA,他可能辐射的方向朝着四面八方
再比如确定了一个立体角dω,但是如果面积A本身比较大,那么辐射的东西就多,如果A本身比较小,那么辐射的东西就少
所以我们两者结合,定义了某一个确定的微小的面dA,和某一个确定的方向。这个确定的区域会往某一个确定的方向(立体角dω)去辐射能量。
1.Definition
再回头看看以下定义:
辐照度:每投影单位面积的功率
光照强度:每立体角的功率
所以辐射度可以理解为:
每个立体角的辐照度
或者
每投影单位面积的光照强度
我们发现辐射度和前面两个量辐照度和光照强度都有关系,因此我们从以下两个方向去理解:
2.Incident Radiance(入射辐射度)
入射辐射度是到达表面的每单位立体角的辐照度。
即它是沿着给定光线(表面上的点和入射方向)到达表面的光。
这里理解成某一个确定微小面积上受到的所有能量(E),在一个角度ω上的分量。
3.Exiting Radiance(出射辐射度)
出射表面辐射率是离开表面的每单位投影面积的强度。
即对于区域光,它是沿给定光线(表面上的点和出射方向)发出的光。
这里理解成一个确定的方向上辐射出来的所有能量(I),在一个微小面积上的分量。
4.Irradiance vs. Radiance
辐照度:面积 dA 接收到的总功率
辐射度:面积 dA 从“方向”dω 接收到的功率
即:
辐照度表示某一个确定微小面积上受到的所有能量,
辐射度表示某一个确定微小面积上受到的所有能量,在一个方向ω上的分量,
辐射度无非就是在辐照度的基础上增加了一个方向性,==辐照度是辐射度在各个单位角上的积分。==把这个式子写出来如下所示:
三.Bidirectional Reflectance Distribution Function (BRDF双向反射分布函数)
从对反射的理解层面,BRDF可以理解为某一个方向的光,在打到某个微小面积后,反射到各个方向,那么各个方向的能量分配,就是BRDF做的事情。
从另一方面理解,一个方向的光打到一个微小的平面被吸收了,吸收后再从这个微小平面被发出去。那么就可以用辐照度和辐射度去解释反射。
对于某一个微小面积,他所接受到的能量辐照度(dE(ωi))(单考虑从某一个方向进来的能量)就是从某一个方向的立体角(dωi)的辐射度(L(ωi)cosθi)
辐射度会被转化成辐照度再出去,也就是
现在的问题是,对于一个微小的面积,我们知道他在某个方向上接收到的某些能量,我们也知道他要把能量辐射到四面八方去,但我不知道他往某个方向上辐射的能量有多少。于是我们定义一个函数来专门描述这个概念:
(一)BRDF
双向反射分布函数 (BRDF) 表示从每个入射方向反射到每个出射方向 ωi 的光量
BRDF研究的是微小面积dA,从某一个微小立体角dωi,接收到的辐照度,会如何被分配到各个不同的立体角上去,需要算的是一个比例。(如果是镜面反射,就会沿着一个立体角全部反射出去;如果是漫反射,就会沿着各个方向均等地反射出去)。
对于任何一个出射方向,算出其辐射度,除以一个微小面积接收到的辐照度,这就是BRDF的定义。
正是因为这个概念,影响了反射,决定了物体表面不同的材质。
(二)The Reflection Equation反射方程
那么如果此时,我盯着某一个反射出去的方向,然后我认为某一个着色点可以接收来自四面八方不同的光照,那么对于每一个入射方向,都会对应一个“入射方向→着色点→出射方向”这样的一个BRDF,那么我们就可以把每一个方向上dω的入射光的强度辐射度乘以cosθ乘以BRDF,然后把每一个入射方向上对出射方向的贡献都加起来,就得到了从反射方向看过去这个点的样子了。
(三)Challenge: Recursive Equation递归问题
但是这里的问题是,入射光线不只是来源于光源,还有一部分来自于其他物体的反射光线。也就是任何输出的光线都有可能是其他点输入的光线,所以光线的传播是一种递归问题
(四)The Rendering Equation渲染方程
让我们重新看反射方程
如果这个物体自己会发光,那么应该把自发光这一项加上(Le)。得到渲染方程:
这里考虑的是一个通用情况,
第一项是自发光Le;
第二项表示的是所有方向入射来的光;
其中H2和Ω+都表示上半球面,cosθ等价于法线n点乘入射方向ω,fr是BRDF,Li是某一条入射光线
Note: now, we assume that all directions are pointing outwards!(依然假设所有方向都向外)
1.Understanding the rendering equation
渲染方程的说明:
(1)上图是一个点光源的情况,那么假设有很多点光源该怎么办?
我们考虑把每一个点光源照亮这个点x,然后反射到观测方向上的值全部加起来即可。(把每个点光源的贡献加起来)
(2)如果有面光源又该怎么办?
==面光源本身就是一些点光源的集合,既然上一步我们可以把每个点光源的贡献加起来,那么对于一个面光源,我们就把面光源上每个点的贡献积分起来,==积分这个面光源所占据的立体角,然后考虑所有覆盖的方向,从每一个方向来的辐射度,经过BRDF反射过去应该是什么样的辐射度出去,把之前的求和变成了积分。
(3)但是照亮到一个点的辐射度可不一定就是来自于光源,也有可能是其他物体反射来的,这时候又该怎么办?
这时,我们不知道反射光的辐射度是多少,同时也不知道从其他物体反射过来在此处的入射光的辐射度是多少,其他项我们都知道(自发光和BRDF(材质)我们都可以定义好)。那么对于这个式子来讲不知道的只有各个物体反射的(反射过来和反射出去的)辐射度是多少。
考虑到光线的反射是一个递归问题,所以下面我们来简化这个式子
对于这一个式子,我们可以进一步把BRDF简写成某种操作符(算子)
对于所有物体辐射出来的所有能量将其写成所有光源辐射出来的能量加上辐射出来的能量被反射之后的能量。
这样写(忽略了很多中间步骤)的目的是最终为了解出L。
L是一个递归定义的,通过数学变换将L移到一边,得到L=(1-K)-1E。
在这里算子(1-K)-1虽然是矩阵,但是同样也具有类似于泰勒展开的性质,因此可以通过泰勒展开展出来。
这种把递归问题转变成算子,最终用泰勒进行展开,泰勒级数的每部分代表光线反射次数的解决方案真是惊艳到我了
这时候就可以把L分解成
E:直接看到光源会看到什么(光源)
+
KE:光源辐射出的能量经过一次反射后会看到什么(直接光照)
+
K2E:光源辐射出的能量经过两次反射后会看到什么(间接光照)
+
K3E:光源辐射出的能量经过三次反射后会看到什么(间接光照)
+
…
这就是对于光线弹射次数的一个分解。==如果光线一次都不弹射直接打到人的眼睛里,那么看到的就是光源E;如果光线弹射一次后打到人的眼睛里,看到的就是直接光照KE(包括阴影);如果弹射两次,看到的就是间接光照;弹射三次就是…弹射越多就是更多的间接光照。==光线弹射两次中间就包括了反射(比如光从眼睛出发,打到镜子弹射一次,再打到物体又弹射一次。),反射本身就是一种间接光照。
全部光照弹射的次数加起来就叫全局光照(直接和间接光照的集合)
2.从另一个角度来理解:光栅化可以干什么?
光栅化能够告诉我们光线传播的内容只有0次(E)和一次(KE)的弹射,也就是只包括光源自己和直接光照部分,后面的部分就是光栅化比较难做的部分。这也就是为什么要用光线追踪的方法来解决光线传播问题的一个理由。
3.下面用直观的例子来理解光线追踪的式子
直接光照(p点是黑的,没有光)
一次间接光照:将光弹射两次的部分引起的间接光照加入直接光照之后(p点亮了)
两次间接光照:光线在场景中弹射三次。考虑的是光线在场景中弹射一次、两次和三次的总共全局光照效果
四次间接光照:光线在场景中弹射五次。场景更亮了(p点清晰可见)。
这里有个细节,在上一幅图(光线在场景中弹射三次)中,图片顶部的灯是暗的,而到了这一幅图,图片顶部的灯可以透过光线了(亮了)。这里的这个灯是玻璃的,如果光线在场景中弹射三次,只够光在摄像机进入灯里,出不来,经过若干次弹射才能出来。(灯的玻璃可能是双层的,经过两次弹射才能进去,再经过两次弹射才能出来)
不断增加弹射次数可以发现,整个画面的亮度变化不大了。假设真的能做无限次的光的弹射,那么最后会收敛到某一个亮度,之后就不会再出现剧烈的变化,会基本保持在某个亮度。(能量守恒和单位时间问题)