games101_Lecture18
Advanced Light Transport
有偏和无偏的光线传播:
- 无偏:使用蒙特卡洛方法解积分时,不管用多少样本,得到的期望是我们需要的真实值。
- 有偏:估计出来的期望与真实值不一样。
- 极限情况下,也就是样本足够多,多到收敛到真实值。但这也是也是有偏的,称为consistent。对应到渲染结果,如果结果相对真实值较模糊,则是有偏的,但当样本足够多结果接近真实值就是一致的。
无偏光线传播方法(Unbiased light transport methods)
双向路径追踪(BDPT,Bidirectional Path Tracing)
之前做的路径追踪,利用了光路的可逆性,从相机开始产生路径,最后连接相机与光源。
但对于双向路径追踪来说,就需要把路径追踪这个概念拓展一下:
- 它会生成两个半路径或子路径,即从相机和光源两个点出发,分别打出一系列伴路径(sub-paths)。
- 双向路径追踪把两个伴路径的最终端点给连接起来。
- 虽然双向路径追踪思想简单,但要想实现是非常难的。
下图是同等条件下,做单向路径追踪和双向路径追踪的对比举例:
Metropolis Light Transport (MLT)
简单理解马尔科夫链:当前有一个样本,马尔科夫链可以根据当前样本,生成当前样本靠近的下一个样本,因此与之前的均匀采样不一样。
MLT使用了马尔科夫链蒙特卡洛方法(Markov Chain Monte Carlo, MCMC),给定足够的时间,能生成一系列以任意函数的形状为pdf的样本。而当采样的pdf与要积分的函数形状一致的时候,这时候的variance最小,效果最好。
对于任何未知的函数,都可以使用马尔科夫链方法生成一系列的样本,使得这些样本分布,就是和这些被积函数形状一致。
对应在光路上是一个局部方法,当存在一条路径时,可以产生与该路径相似的路径。如下橙色与蓝色路径。
比如说蓝色的光路是我们已经找到的,在这个基础上对蓝色的光路进行一些扰动,各个交点都动一动,就会形成一条新的路径。通过不断地在周围产生新的样本的方法,最后就可以找出所有的path。
上图是BDPT和MLT的对比图,说一下MLT的优点:
- 越难的场景(间接光照较多的场景),使用MLT效果越好。
- 是无偏(unbiased)光线传播方法。
再说一下MLT的缺点:
- 很难在理论上分析其收敛速度,不知道什么时候收敛;
- 所有操作都是局部的,有些地方收敛快,有些地方收敛慢;
- 通常会创造出比较脏的结果;
- 因此不能用来渲染动画。
有偏光线传播方法(Biased light transport methods)
光子映射(Photon Mapping)
- 一种有偏光线传播方法,也是一个两步地做法;
- 适合复杂的光线传播,Specular-Diffuse-Specular(SDS);
- 适合渲染caustics(翻译成聚焦,没有发散的意思):是由于光线聚焦产生的一种非常强的图案,如下图:
光子映射的一种实现方法
-
阶段一——光子追踪
从光源出发,会辐射出很多光子,光子往各个方向打出去,碰到物体也会做相应地反射或者折射或者其他操作,直到光子打到一个漫反射表面上停止。
-
阶段二——光子收集(最后生成)
从眼睛(或者说摄像机)开始,打出一系列地sub-paths,这些伴路径也是该反射反射,该折射折射,直到打到漫反射物体表面上。 -
阶段三——局部密度估计
- 已知第一步已经把所有光子都记录在diffuse表面上了,第二部从视角出发也弹射了很多次停在diffuse表面上,然后把这两步合起来进行计算,计算局部的密度估计。
- 所以光子聚集越多的地方月亮,反之越暗。
- 对于任何一个着色点,取它周围的最近的N个光子(使用加速结构模式进行计算),计算这些光子占据的面积有多大,然后就可以计算出该面积上的光子的密度。
Why biased?
从计算局部密度估计上就可以看出原因:
右边的ΔA与左边的dA本质上就不同,ΔA是根据具体的面积,而dA则是单位面积,所以正常情况下两边的公式不等。除非ΔA无限小,两边的公式才可能相等。
但当N取较小时,噪声大,N取较大时,会模糊。
如果将原先只打出大量的光子改成打出巨量的光子,同时N的取值不变,所以N个光子一定会覆盖更小的区域,但是结果多少有点糊。这时的ΔA就会更接近dA。
在渲染中有偏更容易理解的解释:
- 有偏(biased)——只要结果有任何一点模糊。
- 一致(consistent)——虽然有模糊,但是只要样本足够多,最后就会让它收敛到不模糊的结果。
为什么不取一个固定的面积?
- 因为如果确定取一个固定面积,那么不管有多少光子,ΔA都是确定的,那这样的结果求出来永远都是有偏的。
Vertex Connection and Merging(VCM)
- 是BDPT和光子追踪的结合体;
- 主要思想:
- 如果伴路径的端点无法连接但可以合并,则不要浪费BDPT中的伴路径;
- 使用光子映射处理附近“光子”的合并。
Instant Radiosity(IR,实时辐射度)
- 有时又称为many-light(许多光源)方法。
- 主要思想:
- 已经被照亮的面可以认为它们是光源,用它们继续照亮其他地方。
- 方法:
- 先从光源打出很多light sub-paths,会停在很多地方。
- 接着将这些地方当作新的光源。
- 当摄像机看向一个点的时候,就用所有光源来照亮这个点。
优点:
- 快速,并且经常能在漫反射场景中得到好的结果。
上图采用的是许多光源的方法,并不是真正的IR方法。
缺点:
- Spikes will emerge when VPLs are close to shading points.(如下图,在一些地方会出现莫名其妙的光点。)
- 不能处理Glossy材质。
Advanced Appearance Modeling
非表面模型(Non-surface Models)
散射介质(Participating media)
下面是雾气介质:
下面是云介质:
云,雾等介质。光打过来会被小颗粒散射到四面八方。
- 图1:光线在传播的过程中逐渐消失,能量被吸收。(比如乌云)
- 图2:光线在行进的过程中,传进了一个会发光的光源。(先不考虑)
- 图3:光线在行进的过程中,碰到了冰晶,于是将光线随机传播到其他方向上去。
- 图4:传播过程中也可能收到从其他不同方向反射过来的光线,然后收集到的能量往一个方向上反射出去。
- 也就是光在传播过程中会发生两件事情:被吸收和传播。
那么怎么散射?
通常情况下我们认为碰到了diffuse表面上会进行均匀的散射。
散射介质有点像BRDF,但对于散射介质来说,相位函数(Phase Function)定义了散射的方式。使用相位函数描述参与介质中任意点x处光散射的角分布。
散射介质的渲染:
- Randomly choose a direction to bounce
- Randomly choose a distance to go straight
- At each ‘shading point’, connect to the light
光线往某方向走多远取决于介质的吸收能力,遇到小颗粒会反射,在任何一点都可能改变方向,找到一个与光源相连的路径计算其贡献。
应用:
头发外形(Hair Appearance)
也是一种不是定义在物体表面上的材质。
上面有两种高光:
- 无色的高光;
- 有色的高光。
Kajiya-Kay Model
一开始人们研究毛发,采用的是简单的模型——Kajiya-Kay模型
将一根头发当成一根圆柱,所以当有一根光线打到圆柱上,会产生一个漏斗形的散射范围。
Marschner Model
这才是一种现在广泛使用的模型。
上面这种模型考虑了光线打到圆柱上:
- R:会有一部分光线被直接反射掉;
- TT:也有一部分会穿到头发里面去(光线甚至能穿透人类的皮肤),发生折射再穿出去;
- TRT:还有一部分,光线穿透到头发里,在头发的内壁上发生一次反射,往回走再发生一次穿透。
Marschner模型将头发当成玻璃材质的圆柱,头发当然可以扭曲,只是将局部当成直的。
- 将头发分成内部的皮层(cortex),和外部的角质层(cuticle);
- 头发内部有色素,所以光线在传播过程中会有部分光会被头发内部吸收,再穿出去。(黑色吸收地多,金色的吸收地少)。
- 可以知道再在该模型中,我们分三种光线交互:R,TT,TRT。
Marschner模型应用:
上述步骤都是只针对一根头发,对于大量的头发的处理过程可想而知,光源在穿透完一根头发出来后又会进入其他头发中,所以头发的渲染是一项巨大的工程,需要进行巨量的计算。
毛发外观(Fur Appearance)
不能使用人的头发渲染方法来渲染动物的毛。生物结构上不同。动物的毛的髓质多。
可以看出动物的髓质(Medulla)要比人类大很多。光线进去之后更容易发生散射。
双层圆柱模型(Double Cylinder Model)
所以根据上面的理论,又有人提出双层圆柱模型,这是考虑到髓质,并将其精准地描述出来的模型。
通过上图可以看出,相比于Marchner模型,多了两层:TTs和TRTs。
下图每一根毛发都是真实存在的,每一帧都渲染了很长时间。
颗粒材质(Granular material)
我们能通过程序定义,避免所有颗粒的显式建模。
比如下图,远看是沙丘:
近看是颗粒:
表面模型(Surface Models)
Translucent Material
这里翻译成半透明材质不太准确,准确来说,半透明是semi-transparent,translucent和半透明是有区别的,光线是可以在物体内部发生大量散射,再出射到别的方向去,并不只是沿着直线传播。
比如玉石地材质:
又比如说水母:
物理模型:
次表面散射:光线从一个点进入表面,在内部发生了大量散射,最终再出去。
BRDF的所有作用都发生在一个点上,而BSSRDF是由一个方向进来,但是可以从其他方向出去, 进来和出去的点不一定一样。渲染方程要考虑对表面其他地方进入的光线,要对面积进行积分。也就是BSSRDF对方向和面积均要积分。
下面是用两个光源近似表现次表面反射的效果。
Cloth
布料材质:
- 一系列缠绕的纤维构成的。
- 纤维缠绕变成一股,股缠绕变成纱线,线织成布料。
- 布料都是缠绕而成的,如果要计算他们的表面模型,就需要与纺织的方向(也就是织法有关),当表面模型进行渲染,不同的织法有不同的BRDF。
- 对于天鹅绒来说,它的材质是所有纤维一根一根往外分布的,不是一个平面,所以不能拿BRDF来描述它。
- 将布料当成散射介质来渲染
将织布认为是空间中分布的体积,然后将这个体积划分成极其细小的格子,可以知道每个格子中纤维的朝向分布和复杂程度等特性,就可以将这些性质转化为光线的吸收和散射,这种情况下就像在渲染云一样。可以得到相对准确的结果,但是相对应的,电脑的计算量也是非常夸张的。
- 最暴力的做法,把每一根纤维都渲染出来。计算量惊人。
Detailed Appearance:Motivation
有的东西渲染出来看着十分完美,反而显得不够真实。
真实的世界应该是下面那样,会有划痕,会有高光等等。
热水壶真实感对比:
使用200k x 200k的法线贴图(很大的贴图),给予每一个点不同的法线,会得到下面的效果:
亮片材质:
逐个追踪单根光线,很多光线并不能打到光源上,没有实际作用。
所以解决方法是考虑像素,一个像素会覆盖很多的微表面,如果能把微表面分布给拿出来,在一个范围内将这个微表面的法线分布算出来,就能替代原本光滑的分布,并且用在微表面模型里。
所以考虑一个像素覆盖了多大的范围,那就会法线很多神奇的发现分布,有些分布就会显示出统计学的概率;同样覆盖范围小,也会显示出一些独特的性质:
程序化生成表面(Procedural Appearance)
不是真正生成材质,用一定方式指导材质的生成,并且可以动态查询(不生成,随用随取)。通过加入噪声函数,在没有材质的情况下定义细节,,如下所示: