Light Transport & Global Illumination

引言

GAMES101现代图形学入门是由闫令琪老师教授。前面的课程提到光线追踪是怎么做的,今天我们来讲光线追踪的第三部分,结束之前的辐射度量学并引入复杂的光线传播理论以及全局光照。

Radiometry cont

Reviewing Concepts

Differential Solid Angles

Irradiance

Definition: The irradiance is the power per unit area incident on a surface point.

Irradiance 的定义是每单位面积对应的power,微小的面积有微小的能量,那么微小的能量除以微小的面积不就是 power per area。在中文中Irradiance 被称为辐照度,指单位面积上的辐射通量。

Lambert’s Cosine Law

我们在 Blin-Phong 着色模型漫反射中提过 Lambert’s Cosine Law。我有一束平行光,然后打到单位的面上:如果是垂直的,那么六根光线全部接收到;如果这个面歪一点,那它实际上只能接收到三根;如果它歪了某一个角度,那么它接收到的能量 $E = \frac{\phi}{A}\cos\theta$​。

正是因为我们定义必须是垂直于光线的面积或者投影到垂直面的面积,那才算是我们要的面积。如果当面不垂直于这些光线,接收到的能量就会变小。

Why Do We Have Seasons?

我们之前提到为什么地球上不同地方有冬天有夏天呢?那是因为阳光和不同区域的夹角是不一样的,如果阳光始终垂直于某一个区域,那么它接收到的能量就多;如果阳光不垂直于某个区域,它接收的能量就少,这个道理正好就可以通过 Irradiance 解释。

我们之前还有一个概念也可以通过这种方式得到一个正确的解释。我们说一个点光源它在传播的过程中有一个 $r^2$ 的衰减,在 Blin-Phong 着色模型时提到这个点光源到达着色点和着色点本身吸收都有能量损失,那到达这一点也可以通过 Irradiance 来解释。

我们定义点光源的能量,它往各个方向都是均等地辐射能量。我们之前所说的理解是把能量分布在“壳”上,“壳”越大每一个地方分布的能量就越少。那么同样道理,Irradiance 是单位面积上接收的能量,对于中间的单位圆来说 $E = \frac{\phi}{4\pi}$,离远一些 $E = \frac{\phi}{4\pi r^2} = \frac{E}{r^2}$,对比单位圆来说就是按 $r^2$ 衰减,所以我们可以得到一个更准确的理解:Irradiance 在衰减而非 Intensity。

Radiance

Radiance 是为了描述光线的属性,定义为单位立体角单位面积上的 power。 可以理解为光线从某一个很小的表面辐射出,往不同的方向辐射,我们通过这种方式去定义它。

我们刚刚说它的概念是微分两次,但是我们可以通过 Radiance 和前面的 Irradiance、Intensity 联系起来。

Incident Radiance

比如说我们来看 Irradiance 就是上图小的 $dA$ 收到的能量往某一个方向辐射,我这个能量本身可能会辐射到各个不同的地方,但这个能量往这个地方去辐射会辐射出多大的强度。反过来我们也可以理解为某一个方向打到一个小的面积上到达这个面的能量就是 Irradiance,如果考虑环境四面八方的能量,这个概念就是 Radiance。

Irradiance 和 Radiance 的区别就在于是否有方向性,考虑从一个方向过来并被 $dA$ 收到的能量。

Exiting Radiance

一个面发出去的能量也可以类似理解。这个小的面 $dA$​​ 会往各个方向发出能量,而 Intensity 是每一个立体角上的能量是多少,那我们现在就看它往这一个确定的 $d\omega$ 上去有多少确定的 Intensity。

Irradiance vs. Radiance

Irradiance 和 Radiance 两者用得非常多,那图形学为什么要花大力气去理解这些呢?Irradiance 就是它收到的所有能量,对于 Radiance 来说还是看一个很小的范围,它会收到不同的能量,但我就考虑它从某一方向 $d\omega$​ 进来收到的能量。所以 Radiance 无非是在 Irradiance 上增加一个方向性。

Bidirectional Reflectance Distribution Function (BRDF)

Reflection at a Point

BRDF 双向反射分布函数,是一个非常非常复杂的概念。沿用刚才的思路,我们试图用这种方法来理解一下反射到底是什么。反射,假设有一根光线打到一面镜子,它会反射到某一方向去,如果打到漫反射物体它会往四面八方去,我需要一个函数来描述这种性质,这个性质我描述成从某个方向进去并且反射到某个方向去,这个能量是多少,这也正是 BRDF 做的事情,它会告诉你如果从某个方向进来不同的反射方向会分布多少能量。

光进来打到一个物体,然后被弹走改变一下方向,这是一种理解,另外一种理解我们可以理解为光线打到某一个物体表面被吸收了,然后吸收了之后再从这个物体表面把这部分能量发出来。这样我们就可以用 Irradiance 和 Radiance 的知识来解释,反射首先需要有光线打到这个物体的某一个位置,我们假设从某一个立体角进来某一个能量,打到一个小的表面 $dA$,那么从 $\omega_i$ 来的 Radiance 会打到 $dA$ 上收到的能量,会转化为能量然后辐射到四面八方方向上去。

现在我对于这么一个小块,知道它从某一方向接收到了某些能量,我知道它要把能量辐射到四面八方去,我不知道它往“这个方向”辐射出去会有多少能量。那么现在我们定义一个函数,专门用来描述这么一个概念:考虑微小面积 $dA$ 从微小立体角 $d\omega_i$​​ 接收到的 Irradiance 会如何被分配到各个不同的立体角上去。这里就是一个比例,对于任何一个出射方向算出一个 Radiance 除以小块接收到的 Irradiance,这就是 BRDF 的定义。

BRDF

BRDF 会告诉我们这个表面如何把一个方向收集到的能量反射到另一个方向去,正是上面的这个比例。这一个小块收到的 Irradiance 是可以算的,它会辐射到各个方向去都会有,至于是漫反射还是镜面反射会有一个往各个方向的分配问题,那么 BRDF 就是定义如何去分配。

上面都是 BRDF 数学或物理上的定义,我们理解起来就是从一个方向进来打到某个物体之后,我往不同的方向上去反射它的能量分布。比如它是镜面的,那我就知道它反射出去的方向分布了所有的能量,其他不是镜面反射方向都不会有任何能量,这就是镜面反射;如果是漫反射会告诉我进来的这部分能量会被均等地分到各个不同出去的方向上。

忽略 BRDF 的推导部分,它的概念其实就是描述了光线和物体如何作用。正是因为这么一个概念,它会决定物体不同的材质到底会怎么回事,BRDF 会定义不同的材质。

The Reflection Equation

BRDF 告诉我们我从某一个方向上考虑它的入射,它往某一个方向反射出去会是什么样的结果。那如果我盯着某一个反射出去的方向,然后我认为我看到的某一个着色点可以接收来自四面八方不同的光照,那我们考虑对每一个入射方向是否都会对应入射方向 – 着色点 – 出射方向这么一个 BRDF(从某个方向进来的光反射的出射方向有多强),我把每一个方向的入射的光的强度乘以 BRDF 乘以立体角,然后把每一个方向对出射方向的贡献加起来,可以得到这个点在所有可能的入射光下最后反射到这个方向上看过去是什么样子的。

所谓反射方程,定义的是任何一个着色点它在各种不同的光照环境下考虑任何一个输入光照进入方向对观测/出射方向的贡献,我们把所有入射光线的贡献加起来,自然可以得到最后应该长什么样子。

Challenge: Recursive Equation

反射方程告诉我们我要从某个点观察某个方向的某个着色点,我要考虑能够到达着色点的所有光线,但能够到达着色点的所有光线不只有光源,其他物体也有可能会有光反射进来。光线在场景中不止弹射一次,任何出射的 Radiance 都有可能作为其他的点的 Radiance,所以它本身是一个递归的定义方式。

The Rendering Equation

从反射方程我们要推出更加通用的渲染方程,早期的中文翻译 Rendering 又被称为绘制,所以绘制方程和渲染方程是一回事。

我们刚才说反射方程考虑从任意一个方向上来的能量,经过 BRDF 反射到了出射能量上去,有一点我们忽略了,如果这个物体自己会发光怎么办呢?很简单,我们把发的光加上就可以了,上面的黑框就是渲染方程。说白了就是这个物体往某一个方向出射的光有两部分构成:第一是它自己产生发射的光;第二通过别人反射或光源照亮的入射光,这就是一个很完备的定义了。

Understanding the rendering equation

现在我们没有必要纠结复杂的推导,可以尝试从概念入手去理解。

Reflection Equation

我们先从反射方程来看,假设我们有一个点光源,那么反射方程是我看到的能量就是自己的发光项 + 入射光 * BRDF * 立体角。

那么假设我有很多点光源又该如何理解?自然就是说把每一个点光源照亮这个点反射到我的观测方向上的能量加起来,在生活中体现在开灯越多光线越亮,这是光线传播的线性性质。

之前考虑的是点光源,那面光源呢?面光源我们理解为点光源的集合,那如果我们之前可以把一堆点光源贡献加起来,那现在我们也可以把面光源上任意一点的贡献积分起来,道理是一样的。

Rendering Equation

我们不需要通过什么麻烦的修正来做渲染方程,到目前为止我们已经知道这一点往某一方向辐射的 Radiance 依赖于其他的点辐射出去的 Radiance,也就是我们之前说的递归过程。

这就是当年渲染方程和这张图,可以看到反射和阴影,是一个跨时代的发明。

Rendering Equation as Integral Equation

理解为递归的好处是从某个方向看向某一点我不知道看到的是多少,从其他物体反射的 Radiance 自然我也不知道也需要解,其他的项我都知道:任何一个物体是怎么发光的、各个物体不同的材质,中间这些项不知道的就是各个物体反射出去的 Radiance 是多少。

在数学上就有一些简单的表达方式把复杂的式子写的稍微明白一点,两个不同的位置就用 uv 表示,Randiance 就用 l,对渲染方程做一个数学上的简写积分。

Linear Operator Equation

甚至我们可以简写为某种操作符或算符。我对所有物体辐射出来的所有能量写成所有光源辐射出的能量加上辐射出来的能量被反射出来的能量,K 视为反射操作符。

Ray Tracing and extensions

我可以通过数学上的变化解出 L,这种算子拥有泰勒展开的性质。

Ray Tracing

最后我会分解为上面的形式:我直接看到光源会看到什么 + 光源辐射出来的能量经过一次反射之后会看到什么 + 光源辐射出来的能量经过两次反射之后会看到什么……自然而然是对于光线传播弹射次数的分解,如果光线一次也不弹射直接打到眼睛里就是光源;如果光线弹射一次看到的东西就是直接光照,包括阴影;如果光线弹射两次,我们看到的就是间接光照,三次四次就是更多的间接光照。

这样我们把渲染方程拆成了很多项,自然而然就可以得到弹射次数的分解。自然我们引出全局光照的概念,包括所有不同的光线弹射次数加起来的结果叫做全局光照,是直接光照和间接光照的集合。

另外一个角度理解是看光栅化可以做什么。着色做的就是直接光照,光栅化能够告诉我们光线传播的内容其实只有零次和一次两者:包括光源自己和直接光照部分,后面的部分就是光栅化比较难做的。

Probability Review

Random Variables

随机变量就是可能取很多值的一个数,它的分布是说随机变量可以取某些值有很大概率,取另外一些值有小的概率。举个例子,骰子六个面,摇骰子任何一个面在上的概率都是相等的,这就是随机变量和分布的概念。

Probabilities

随机变量可以取不同的值,并且它会以不同的概率取不同的值。总结一下随机变量的属性:

  • 概率一定是非负的
  • 所有的可能性加起来为1

Expected Value of a Random Variable

对于随机变量还有一个非常重要的概念是期望:我不断去取随机变量求它们的平均值。对于一个骰子来说它可以取1、2、3、4、5、6,它的取值概率都是 1/6,所以期望为 3.5。

Probability Distribution Function (PDF)

在连续情况下我们如何描述变量和分布呢?刚才我们说随机变量可以取一些固定离散的值,但现在我们说这个变量可以取连续区域,对应的概率是概率密度函数微元形成的面积。

Function of a Random Variable


GAMES101_Lecture_15