Advanced Light Transport
有偏和无偏的光线传播:
- 无偏:使用蒙特卡洛方法解积分时,不管用多少样本呢,得到的期望是真实值
- 有偏:估计出来的期望与真实值不一样。极限情况下收敛到真实值也是有偏的,称为consistent。对应到渲染结果,如果结果相对真实值较模糊,则是有偏的,但当样本足够多结果接近真实值就是一致的。
无偏光线传播方法 Unbiased light transport methods
双向路径追踪 Bidirectional Path Tracing (BDPT)
之前做的路径追踪,利用了光路的可逆性,从相机开始产生路径,连接相机与光源。
而双向路径追踪会生成两个不同的子路径,从光源会打出路径,从相机也会打出路径,
在着色点把两个路径连起来,就形成了整条路径。
思想很简单,实现很困难。
以下是相同采样率下单向和双向的结果:
Metropolis Light Transport (MLT)
简单理解马尔科夫链:当前有一个样本,马尔科夫链可以生成一个和这个样本靠近的下一个样本,因此与之前的均匀采样不一样。
MLT使用了马尔科夫链蒙特卡洛方法(Markov Chain Monte Carlo, MCMC),给定足够的时间,能生成一系列以任意函数的形状为pdf的样本。而当采样的pdf 与 要积分的函数 形状一致的时候,效果最好。
因此对于任意未知的函数,都可以通过马尔科夫链的方法得到一系列的样本,使得这些样本的分布,和被积函数的形状一致。对应在光路上是一个局部方法,当存在一条路径时,可以产生与该路径相似的路径。如下橙色与蓝色路径。
优点:越难的场景(间接光照较多的场景),使用MLT效果越好。
缺点:很难在理论上分析其收敛速度,不知道什么时候收敛;所有操作都是局部的,有些地方收敛快,有些地方收敛慢;不能用来渲染动画。
有偏光线传播方法 Biased light transport methods
光子映射 Photon Mapping
- 适合渲染caustics(由于光线聚焦产生的一种非常强的图案),如下图:
- 适合复杂的光线传播,Specular-Diffuse-Specular(SDS)
光子映射的一种实现方法
- 光子从光源被源源不断地打出来,经过反射、折射,在diffuse表面会停下来;从摄像机开始往各个方向打多种路径,经过反射折射等也会在diffuse表面停下来。
- 局部密度估计:光子分布越集中越亮,因此对任何一个着色点取周围最近的N个光子,找出这N个光子的占据的面积,从而算出密度。
但当N取较小时,噪声大,N取较大时,会模糊。一般应该取足够小的面积,选择面积内的光子数量来计算密度,所以上述计算方式有问题。顺应这个思路,当打出的光子足够多时,相对面积就会很小。
但若取固定的面积来计算,当光子很多时,会导致面积内光子变多,造成结果依旧不准确。
Vertex Connection and Merging
将双向路径追踪和光子映射结合起来。应用挺广泛。
Instant radiosity (VPL / many light methods)
已经被照亮的表面就认为是光源。光源打出光线,被照亮的地方是新光源,使用所有新光源来照亮着色点。相当于考虑了间接光照。
渲染出来有些地方可能会莫名地发光。
不能针对glossy的物体。
Advanced Appearance Modeling
非表面模型 Non-Surface Models
散射介质 Participating Media
云,雾。光打过来会被小颗粒散射到四面八方。
Phase Function相位函数定义了散射的方式。
如何渲染?光线往某方向走多远取决于介质的吸收能力,遇到小颗粒会反射,在任何一点都可能改变方向,找到一个与光源相连的路径计算其贡献。
Hair Appearance
需要考虑光线与每根头发的作用。
Kajiya-Kay Model
光线打到头发上会散射出一个圆锥。
效果不好。
Marschner Model
光线不仅会反射(R),穿进头发发生折射(T),穿进头发再穿出(TT),穿透反射再穿透(TRT)。
将头发当成一个玻璃圆柱,外层叫cuticle,里面叫cortex。
光线跟头发会产生多次散射,渲染很困难,计算量很大。
Fur Apperance
不能使用人的头发渲染方法来渲染动物的毛。生物结构上不同。动物的毛的髓质多。
使用双层圆柱模型来建模动物毛发,更为复杂。
Granular(颗粒) material
并没有很好的效果。
远看是沙丘,近看是小颗粒堆积的。
表面模型 Surface Models
Translucent(半透明) Material
次表面散射:光线从一个点进入表面,在内部发生了大量散射,最终再出去。
次表面散射可以看成对BRDF概念的延伸,BRDF的所有作用都发生在一个点上,而BSSRDF是由一个方向进来,但是可以从其他方向出去, 进来和出去的点不一定一样。渲染方程要考虑对表面其他地方进入的光线,要对面积进行积分。
Dipole方法近似次表面散射,使用两个光源来模拟。
Cloth
纤维缠绕成股,股缠绕成线,由线编制为布。
布料渲染方法:
- 当表面模型进行渲染,不同的织法有不同的BRDF。
- 但对天鹅绒这种织物没办法像上述那样做。因此把织物认为是空间中分布的体积,划分成超级细小的格子,每个格子里知道纤维的分布与朝向,分开来计算。即将织物当作一个体积,知道体积中微小的块的性质。类似云烟的渲染。
- 最暴力的做法把每根纤维渲染出来,像头发一样。
Detailed material (non-statistical BRDF)
有的东西渲染出来太完美,不够真实。
渲染:
真实:
微表面模型中使用不同的法线分布,若法线分布有一些噪音,可以得到含有噪声的真实效果。
但这样渲染非常慢。
解决方法:
微表面的镜面反射在法线分布复杂的情况下,很难建立有效的的反射光路(光源→表面→摄像机)。
因此让一个像素对应很多微表面,把整块范围内的法线分布替换原本光滑的分布。
一个像素覆盖的微表面数量不同,会得到不同的效果。
PS:
波动光学:之前所有的计算都把光线当作粒子来计算,但光具有波粒二象性,有很多只有在把光当作波的时候才会有的性质就会被忽略,并且在尺度很小的情况下,波动性会起作用,发生干涉衍射。
波动光学的BRDF结果与几何光学类似,但不连续(干涉导致)
程序化生成 Procedural appearance
而不是真正生成材质,用一定方式指导材质的生成,并且可以动态查询。(不存储,随用随算)。一般使用一些噪声函数。
Houdini专门做这个。