GAMES101-现代计算机图形学入门-闫令琪——Lecture 18 Advanced Topics in Rendering
目录
GAMES101-现代计算机图形学入门-闫令琪——Lecture 18 Advanced Topics in Rendering
Advanced Light Transport (高级光线传播)
-
Unbiased light transport methods
– Bidirectional path tracing (BDPT)
– Metropolis light transport (MLT) -
Biased light transport methods
– Photon mapping
– Vertex connection and merging (VCM) -
Instant radiosity (VPL / many light methods)
Biased vs. Unbiased Monte Carlo Estimators
-
An unbiased Monte Carlo technique does not have any systematic error
– The expected value of an unbiased estimator will always be the correct value, no matter how many samples are used -
Otherwise, biased
– One special case, the expected value converges to the correct value as infinite #samples are used — consistent
We’ll look again at this page after introducing Photon Mapping
无偏(Unbiased):蒙特卡洛积分估计出来的结果的期望(无论用多少样本)永远都是我们要的真实值(期望永远是对的)
有偏(Biased):所有其他情况都是有偏。估计出来的期望和实际的值不一样。
虽然取多少样本,得到的结果都是有偏的,但是,在一个极限的定义下,用的样本数足够多,期望值会收敛到正确值。这时候我们称这个值是一致(consistent)。
Bidirectional Path Tracing (BDPT)双向路径追踪
-
Recall: a path connects the camera and the light
-
BDPT
– Traces sub-paths from both the camera and the light
– Connects the end points from both sub-paths
把两个半路径相连

双向路径追踪(无偏):生成两个不同的半路径(子路径),一个是从光源出发的半路径,另一个是从摄像机出发的半路径,把两条半路径的端点连起来(如上图虚线部分)。 -
Suitable if the light transport is complex on the light’s side
-
Difficult to implement & quite slow

双向路径追踪实现起来非常复杂,但是在一些情况下渲染出来的结果很好。如上图场景。这个场景里光源仅仅往一个角落里打,那么实际上整个场景几乎都是被间接光所照亮的,再加上整个场景几乎都是漫反射材质,光线打上去会往各个方向弹,那么如果这时候用路径追踪,就不容易弹到光源处。那么这时候用路径追踪就很难照亮整个场景。这时候用双向路径追踪,在光源处发出一些光线打到场景中,再从相机发出一些光线打到场景中,把他们端点连起来,就会得到一些很合理的路径。(但是BDPT算起来比较慢)
(BDPT实现起来非常不容易!如果能把这个写对,自己开发渲染器应该没有任何问题!)
Metropolis Light Transport (MLT)
- A Markov Chain Monte Carlo (MCMC) application
– Jumping from the current sample to the next with some PDF - Very good at locally exploring difficult light paths
- Key idea
– Locally perturb an existing path to get a new path

MLT(无偏)用统计学上一个采样的工具:马尔科夫链。马尔科夫链可以根据一个样本生成靠近它的另一个样本。他可以以任意函数的形状为PDF生成样本,使得这一系列样本的分布与被积函数形状一致。
那么将其反应在产生路径上,在给定一个路径的情况下,可以在周围产生很多与其相似的路径(一个局部的方法)。如上图中,已经生成一条蓝色的光路,对其进行一些微小的扰动,就形成了一条新的红色路径
-
Works great with difficult light paths
-
Also unbiased

MLT特别适合做光路传播复杂的计算。因为只需要找出一条光线的路径,就可以以其为种子,生成更多路径。如上图,左侧图的光线仅仅从门缝出来,照亮整个场景,光路复杂;右侧图是水波,光线在水中的传播,会产生焦散现象,光线聚集,光路也极其复杂。 -
Difficult to estimate the convergence rate
-
Does not guarantee equal convergence rate per pixel
-
So, usually produces “dirty” results
-
Therefore, usually not used to render animations

但是其也有坏处。
MLT方法很难在理论上分析其最后收敛的速度(什么时候变成没有噪声的),而且由于所有操作都是局部的,也就是说每个像素自己做自己的,那么最后有一些像素收敛的快,有一些像素收敛的慢,得到的渲染图看上去就会比较脏(如上图)。那么用这种方法渲染动画就不可以。
Photon Mapping 光子映射(有偏)
- A biased approach & A two-stage method
- Very good at handling Specular-Diffuse-Specular (SDS) paths and generating caustics

光子映射(有偏)
特别适合用来渲染caustics(焦散)由于光聚焦所产生的图案(如上图) - Stage 1 — photon tracing
– Emitting photons from the light source, bouncing them around, then recording photons on diffuse surfaces

第一步,光子(光线)从光源出发,在空间中碰到物体该反射还是反射,该折射还是折射,直到碰到diffuse(漫反射)物体,就停下来。当这一步做完后,就可以把所有光子整理起来,就知道了各个光子在哪里。
- Stage 2 — photon collection (final gathering)
– Shoot sub-paths from the camera, bouncing them around, until they hit diffuse surfaces
第二步,光子(光线)从摄像机出发,与第一步一样,在空间中碰到物体该反射还是反射,该折射还是折射,直到碰到diffuse(漫反射)物体,就停下来。当这一步做完后,也可以把所有光子整理起来。
- Calculation — local density estimation
– Idea: areas with more photons should be brighter
– For each shading point, find the nearest N photons. Take the surface area they over

把前两步合起来,就可以做一个局部的密度估计。建立在观察的角度上去看哪部分亮哪部分暗,那么光子分布越集中的地方就会越亮。
局部密度估计:对于任何一个点,取其最近的N个光子,找到后去求这N个光子所占的面的面积,那么光子的密度就是用N除以面积。那么N取多少?取小了图片噪声会很明显,取大了得到的结果会模糊。为什么会模糊?也就是为什么这种方式是有偏的?
-
Why biased?
Local Density estimation dN / dA != ΔN / ΔA
But in the sense of limit
More photons emitted ——>the same N photons covers a smaller ΔA ——> ΔA is closer to dA
So, biased but consistent!
在做密度估计时,我们想算的密度应该是当前一个点周围取一个微小的面积dA,里面有dN个光子,即 dN / dA,但是我们实际上算的密度是ΔA面积中有ΔN个光子,即 ΔN / ΔA。正常情况下两者很接近,但绝对不是相等的,所以对密度的估计是一个不对的估计,只有当dA无限小才会趋向于正确。那么何时ΔA会无限小?只有当打出的光子数无限大的时候,有更多的光子被打在面上,那么得到一个着色点周围同样数量N的光子覆盖的面积才会无限小。这时才会更接近dA。也就是当有无限多数量的光子时,才会接近正确的结果,因此是一个有偏但是一致的方法,所以会糊。 -
An easier understanding bias in rendering
– Biased == blurry
– Consistent == not blurry with infinite #samples
那么由此我们可以得出一种判断有偏和一致的方法:和正确的结果相比,如果得到的结果有任何一点的模糊,那就是有偏的;
如果虽然是模糊的,但是只要样本足够多,最后就会收敛到不模糊的结果,那么就是一致的。
Vertex Connection and Merging(VCM)
- A combination of BDPT and Photon Mapping
- Key idea
– Let’s not waste the sub-paths in BDPT if their end points cannot be connected but can be merged
– Use photon mapping to handle the merging of nearby “photons”

VCM的思想是把双向路径追踪与光子映射结合起来。在做BDPT时,双向发出来的认为是光子,如果两个光子相邻很近(如上图,在一个局部的面里),那么这时候就用光子映射,将这两部分的sub-path结合在一块儿,从而得到了更好的结果。
Instant Radiosity (IR)
-
Sometimes also called many-light approaches
-
Key idea
– Lit surfaces can be treated as light sources -
Approach
– Shoot light sub-paths and assume the end point of each sub-path is a Virtual Point Light (VPL)
– Render the scene as usual using these VPLs

实时辐射度算法。
由于我们一般不区分光线是反射来的还是光源发出来的,都是Radiance,那么对于已经被照亮的地方,都可以认为是光源,再用他们去照亮别的东西。
首先先从光源打出很多light sub-paths,然后会停在某些地方,我认为这些地方变成了新的光源(VPL) 。再看向这个场景的时候用这些VPL去照亮着色点。 -
Pros: fast and usually gives good results on diffuse scenes
-
Cons
– Spikes will emerge when VPLs are close to shading points
– Cannot handle glossy materials
如上图,左图可以看出IR的思想,是用“一堆光源”再去照亮整个场景。
右图是IR存在的问题,有一些地方莫名其妙会发光。(在前面我们提到把对立体角的采样改成对面积的采样的地方,这里与距离平方项有关系,当两点间距离极近,那么除以了一个极接近0的数,得到的结果就非常大,就出现了问题)
而且这种方法无法做glossy材质。
Advanced Appearance Modeling 外观建模
- Non-surface models
– Participating media
– Hair / fur / fiber (BCSDF)
– Granular material - Surface models
– Translucent material (BSSRDF)
– Cloth
– Detailed material (non-statistical BRDF) - Procedural appearance
Non-Surface Models
Participating media(Fog、Cloud)
-
At any point as light travels through a participating medium, it can be (partially) absorbed and scattered

对于云、雾这种材质,当光线穿进去以后,会打到很多小的冰晶,这些结晶会把光线散射到各个方向去同样传播过程中也会接收到各个方向来的光。有些光在传播过程中就被慢慢吸收了。 -
Use Phase Function to describe the angular distribution of light scattering at any point x within participating media

那么光线如何散射?通过一个相位函数。相位函数决定了光是均匀散射还是向前或向后散射
Participating Media: Rendering
- 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

这是一种简单的模型,光线打到圆柱上往四面八方反射,我们考虑会散射出一个圆锥,类似于diffuse和specular同时发生(漫反射和镜面反射)

这种方式渲染出来的头发显然不是很好。
Marschner Model

于是又有了这种模拟真实头发与光作用的模型,当光线打到圆柱时,一部分光被直接反射(R),另一部分会穿到头发里去(T)发生折射然后再穿出来(T)(穿进去穿出来总称为TT),还有一部分穿进去在下表面发生了一次内部反射然后再从上表面穿出来(TRT)。通过这种方式可以定义不同的光线传播
- ①、Glass-like cylinder

将头发当成玻璃圆柱,分为内外两层结构,内部有色素 - ②、3 types of light interactions: R, TT, TRT (R: reflection, T: transmission)

考虑三种光线与圆柱的作用
综合考虑这两种情况,就可以得到很好的渲染结果

Fur Appearance
Cannot represent diffusive and saturated appearanceCannot represent diffusive and saturated appearance
如果用人的毛发渲染方式去渲染动物的毛发,渲染结果显然不对。
Human Hair vs Animal Fur(从生物上探究为什么)

人的毛发和动物毛发区别最大的是最中间的髓质,动物毛发的髓质非常大,在内部更容易发生散射。因此无论是人还是动物的毛发,模拟髓质的散射是有必要的,之前玻璃柱模型忽略髓质是不对的。

可以看到,当给人的头发加上髓质的模拟渲染后,效果会更进一步。
Double Cylinder Model

所以就有了双层圆柱模型

一部分光跟以前的一样,还有一部分在穿过髓质的过程中被发散到各个方向去,还有可能再被反射回去…

引入五种不同描述光线传播的方法,得到的结果如上图所示。
Granular Material 一粒一粒的模型
-
What is granular material?

一堆小东西形成的一个表面模型(糖、盐、沙子…)(颗粒材质) -
Can we avoid explicit modeling of all granules?
– Yes with procedural definition.

比如这个沙子堆成的城堡,认为每一个单元有好多不同的石子以不同的成分比例构成,再渲染。
Surface Models
Subsurface Scattering(Translucent Material)
光线可以从某一个地方进这个表面,再从某一个地方出去(玉石)

Visual characteristics of many surfaces caused by light exiting at different points than it enters
- Violates a fundamental assumption of the BRDF


次表面散射:反应在物理上即为光从一个点进入物体,在物体内部经过多次散射后穿出。可以是BRDF概念上的一个延伸。 - BSSRDF: generalization of BRDF; exitant radiance at one point due to incident differential irradiance at another point:
S ( x i , ω i , x o , ω o ) S\left(x_{i}, \omega_{i}, x_{o}, \omega_{o}\right) S(xi,ωi,xo,ωo)
描述从一个点xi以一个方向ωi进来,再从另一个点xo以另一个方向出去ωo
- Generalization of rendering equation: integrating over all points on the surface and all directions (!)
L ( x o , ω o ) = ∫ A ∫ H 2 S ( x i , ω i , x o , ω o ) L i ( x i , ω i ) cos θ i d ω i d A L\left(x_{o}, \omega_{o}\right)=\int_{A} \int_{H^{2}} S\left(x_{i}, \omega_{i}, x_{o}, \omega_{o}\right) L_{i}\left(x_{i}, \omega_{i}\right) \cos \theta_{i} \mathrm{~d} \omega_{i} \mathrm{~d} A L(xo,ωo)=∫A∫H2S(xi,ωi,xo,ωo)Li(xi,ωi)cosθi dωi dA

相应的渲染方程也要改变,既要对方向积分,也要对面积积分。需要考虑其他位置进来的光
Dipole Approximation [Jensen et al. 2001]
- Approximate light diffusion by introducing two point sources.

人们发现半透明介质(次表面散射)当有一个光打到物体上,就好像是物体底下出现了一个光源,然后会从底下照亮着色点周围一片,但是为了物理上的真实,仅从底下有一个光源照亮还不够,对应上方也要有一个光源。用这两个光源去照亮周围着色点这一块儿,就很像次表面散射得出来的结果。
BRDF vs BSSRDF

cloth
- A collection of twisted fibers!
- Two levels of twist

- Woven or knitted

布料是一系列缠绕的纤维构成的,不同纤维通过第一次缠绕会形成股,不同股缠绕会形成线,线可以织成布。
纤维(fiber)是最原始最初始的概念,纤维通过缠绕可以变成股(Ply),不同的股再经过缠绕会变成线(Yarn)
Cloth: Render as Surface
- Given the weaving pattern, calculate the overall behavior
- Render using a BRDF

布料与织布时的编织图案有关(叠压方式),根据不同的编织图案结合BRDF就可以得出不同的渲染样子。
Render as Surface — Limitation

但是BRDF是针对平面材质的,对于天鹅绒这种材质,实际上是分布在空间中的体积,因此就无法用BRDF渲染。
Cloth: Render as Participating Media
- Properties of individual fibers & their distribution -> scattering parameters
- Render as a participating medium

因此另一种方式就是把空间分成非常小的格子,每个格子我们知道内部纤维朝向分布和复杂程度,将这些性质转化为光的吸收和散射,就好像是在渲染云雾等一样,把布料当成体积。
Cloth: Render as Actual Fibers
- Render every fiber explicitly!

还有一种方式就是用最暴力的做法,把每一根纤维都渲染出来。
Detailed Appearance: Motivation
Not looking realistic, why?

由于上面两幅图太过完美,所以看上去反而不真实。
Real world is more complicated

真实的物体往往都是有不同的划痕,是不完美的。
Recap: Microfacet BRDF

Surface = Specular microfacets + statistical normals


在渲染中,最重要的就是微表面的法线分布。
Statistical NDF vs. Actual NDF

但是我们平常在描述法线分布时用的都是一些很简单的数学模型,如正态分布(上左图),这样的描述方式并没有很多的细节。
但其实我们想要的是,法线分布基本满足数学模型的规律但是要有自己的细节(如上右图)。
Define details

可以用一张很大的法线贴图,来表现细节
Rendering? Too difficult!

但是这种渲染方式太慢了!
Difficult path sampling problem

由于微表面放大后是一个个小的镜面,从摄像机发出来的光线经过镜面以后很难打到光源上去,从光源打过来的也一样,很难反射到摄像机。
Solution: BRDF over a pixel

所以这里可以考虑一个像素会覆盖很多微表面,把一个小的范围之内的微表面的法线分布算出来,这样就可以替代原来光滑的分布,用在微表面模型里。
p-NDFs have sharp features

不同范围会产生不同的效果的法线分布
p-NDF shapes

不同的法线贴图也会产生不同的效果

Recent Trend: Wave Optics

但是,当引入这些细节以后,再用几何光学解释就不对了,当物体小到与光线波长相当的时候,就不能假设光沿直线传播了,要考虑光是波,考虑衍射干涉现象。

由于波动光学,看金属片实际看到的效果是彩色的
Detailed Material under Wave Optics

考虑用波动光学算出BRDF。波动光学和几何光学得到的BRDF是差不多的,但是波动光学得到的BRDF又有不连续的特点(光的干涉会使有的地方加强有的地方减弱,产生一条条的样子)
Procedural Appearance 程序化生成的外观
- Can we define details without textures?
– Yes! Compute a noise function on the fly.
– 3D noise -> internal structure if cut or broken
– Thresholding (noise -> binary noise)

用一些三维空间中的噪声函数。给空间中任何一个x,y,z,可以返回一个值,随用随取。可以得到各种纹理,随用随取,不生成。
Complex noise functions can be very powerful


利用强大的噪声函数可以创造出很多东西,如程序化生成的山和波浪。
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐


所有评论(0)