Games101 图形学入门笔记

渲染前沿技术介绍

光线追踪的很多方法都是使用蒙特卡洛估计解渲染方程,而蒙特卡洛估计分为无偏有偏

  • 无偏蒙特卡洛估计:无论选择多少样本,无偏估计的期望永远是正确的值
  • 有偏蒙特卡洛估计:期望 ≠ 正确值,只有使用无限个样本时,期望会收敛于(无限接近)正确的值

这一章只大概介绍各种新的技术,并不涉及具体实现,有兴趣的可以阅读相关博客文章、论文进行深入学习

1 无偏光线传播方法
\==========

双向路径追踪 (Bidirectional Path Tracing)(BDPT)

之前学的路径追踪,光路是从相机出发,连接光源,形成一条路径。但这种方法对于某些用间接光照亮的场景非常不好用

比如下面这个场景,可以看到大灯是向上照射的,房间中的其他场景几乎都是由光源直接照亮的那一块墙壁反射出去的间接光照亮的。左图尽管每个像素跟踪了32条路径,但是这32条路径最终能成功弹射到光源表面的非常少,甚至是1条都没有,从而出现很多噪点,因为每次弹射都是随机选择1个方向进行下次弹射,光源的角度又比较苛刻,所以成功采样概率小。 右图采用双向路径追踪,对于这种场景就非常适用。

演示图片

大胆猜测一下BDPT算法的思想:先从光源出发,做一次路径追踪照亮一块场景(这块场景可能是直接光照亮,也可能是弹射1、2次照亮,具体可能要看算法怎么规定)。把这一块场景当做光源,再从摄像机做单向路径追踪,得到渲染结果。合起来就是双向路径追踪

BDPT算法:

  • 从光源和相机各追踪一条子路径
  • 连接两条子路径的端点

这个算法也有缺点,速度很慢

闫老师说:BDPT看似简单,要实现正确是非常难的,如果能实现这个算法,手写一个渲染器都是没问题的。

Metropolis Light Transport (MLT)

Metropolis是人名。 他引入马尔可夫链结合蒙特卡洛估计解二重定积分渲染方程。

马尔可夫链蒙特卡洛 (Markov Chain Monte Carlo) (MCMC)

  • 马尔可夫链是统计学中一种帮助采样的工具,它可以根据一个样本,生成跟这个样本靠近的下一个样本。

  • 马尔可夫链可以生成一系列样本,使得这些样本的分布就跟被积函数曲线一样。(对比之前的以任意PDF进行采样,咱用的PDF是一条横线,所有样本的概率都是相等的。但是从结论来看,采用跟被积函数长得差不多的PDF才能得出误差最小的计算结果。)

  • 用在路径追踪里面,就可以实现 局部扰动现有路径去获取一个新的路径 。通过在现有采样点附近生成新采样点,连起来就是新路径。

    演示图片

    适用的场景:

    左图:光源从门外进来的,属于间接光照亮场景,但是光路更加复杂一些,此时用双向路径追踪效果不好,用MLT方法,只要找到一条,就能生成很多条类似的路径,从而提高渲染效果。

    右图:这种Caustics现象,做路径追踪很难,摄像机出发,经过水面一次specular,打到水底会diffuse,再经过水面specular,最终连接光源。这种路径叫做SDS path 非常难计算,中途采样次数特别多,也是很难采到一条正确的路径,但还是那句话,只要找到一条,我就能生成很多条。

    演示图片

MLT方法的缺点

  • 难以估计收敛速度,不知道跑多久能产生没有噪点的渲染结果图

  • 不能保证每像素的收敛速度相等,有些像素收敛快,有些则慢,结果就是通常会产生“肮脏”的结果,因此不用于渲染动画

    演示图片

2 有偏光线传播方法
\==========

光子映射 (Photon Mapping)

非常适合渲染焦散(caustics)Specular-Diffuse-Specular(SDS)路径

演示图片

光子映射实现方法(很多方法中比较简单的一个):

  • (1)photon tracing: 光源发射光子,类似光线一样正常传播,打到漫反射表面后停止并记录。

    演示图片

  • (2)光子采集: 从摄像机出发,打出一些子路径,正常反射、折射传播,打到漫反射表面后停止。

  • (3)局部密度估计(local density estimation):

    • 思想:摄像机出发打出的光线,击中表面视为一个着色点,着色点周围光子越多则越亮。

    • 遍历每个着色点,找到着色点最近的N个光子,并且计算他们他们所围成的面积,计算这一块光子的密度:光子数量除以面积 N/A

      演示图片

这种渲染方法,其实就是模糊和噪声之间的平衡

Photon Mapping存在的问题

  • 光子数量N取小:充满噪声

    演示图片

  • 光子数量N取大:模糊

    演示图片

为什么会有偏差?

  • 因为局部密度估计,应该估计每个着色点的密度 dN / dA ,但是我们实际是计算的 ΔN / ΔA 只有当ΔA 无限趋近dA,结果才准确。如果增加光子发射数量,那么采样相同个数N的光子,覆盖的面积ΔA就会更小,从而接近dA,使得结果更准确。

    因为是极限的思想,所以只能无限接近dA而不可能相等,所以计算的结果一定是有偏

  • 不选择固定大小的面积,然后数里面有多少个光子,然后进行密度估计的原因是:

    如果选择固定大小比如面积为1,那么它就永远不可能趋近与dA(无限小的面积微元),永远得不到一致的图像

渲染中的有偏

  • 有偏 == 模糊
  • 一致 == 只要样本接近无穷,就能收敛到不模糊的结果

光子映射 + 双向路径追踪 (Vertex Connection and Merging)(VCM)

VCM算法很复杂,但是想法很简单,就是BDPT结合Photon Mapping,此方法在电影中广泛应用。

  • 主要还是采用双向路径追踪算法进行计算,但是其中某一个特殊的情况,我们对其进行光子映射的操作

  • 当两个子路径的端点在同一个平面内,这两个路径其实在BDPT中就被放弃掉了,因为直接连接这两个点不满足光线传播规律啊(反射、折射)。但是可以对这两条路径应用光子映射,认为光源那边的子路径发射的是光子,然后混合计算结果就是VCM方法了。

    演示图片

3 实时辐射度算法(Instant Radiosity)
\============================

有时也叫做many-light approaches

  • 关键思想: 把被照亮的表面当做一堆新的点光源(Vritual Point Light) (VPL) ,用这些点光源们照亮着色点。

    演示图片

  • 于这个着色点来说,相机击中它,直接连接光源做着色。而对于那些新的光源,是从真的光源发射的,经过1次或多次弹射形成的。这也是一种双向路径追踪。宏观上看,这个方法实现了用直接光照的计算方法得到的间接光照的结果

  • 优点: 计算速度快,通常在漫反射场景会有很好的表现

  • 缺点: 不能处理光滑带镜面反射(Glossy)的材质;当光源离着色点特别近的时候会出现亮点

    这是由于之前的渲染方程改良后,对光源采样代替了对半球上立体角采样,公式中,分母是光源上某个点到着色点的距离,当这个距离特别近,就会出现结果无限大的情况。

    演示图片

  • 动画、电影等等工业界用得最多的还是 path tracing,虽然听上去不高端,但是渲染结果是最可靠的。* 有的同学可能会问,那这些方法拿来干啥的?其实这些听上去很高端的算法就是学术界的探索、尝试、研究。

外观 = 材质 = BRDF

4 前沿的外观建模技术
\===========

非表面模型(Non-Surface Models)

参与介质(Participating Media)

参与介质:微观散射粒子的集合,也可以叫做散射介质

类似云、雾霾等,显然不是定义在一个表面上的,而是定义在空间中的。

光线(直接or间接)会穿过介质,介质会吸收一定的能量,并且往外随机的朝各个方向散射能量。

演示图片

定义参与介质以何种方式向外散射的函数叫相位函数Phase Function

  • 比如下图这三种散射形式(向后散射、均匀向空间散射、向前散射)

    演示图片

参与介质的渲染方式: 其实可以理解成平面材质的渲染,只不过着色点不是击中平面某个点,而是参与介质中随机选择一个点。然后随机选择一个反射方向,随机选择前进多远,再选择某个点,重复进行直到光源,形成一个path。

  • 随机选择一个方向反弹

  • 随机选择一个行进距离

  • 在每个着色点,都连到光源

    演示图片

    应用:

    演示图片

    下面这个兔子也是应用散射介质渲染出来的,只是光进去物质内部比较少而已。

    演示图片

毛发、纤维

考虑光线如何跟一根曲线作用

演示图片

(1)Kajiya-Kay Model(不常用)

演示图片

演示图片

(2)Marschner Model(常用)

把光线与毛发的作用分为三个部分

  • R:在毛发表面反射到一个锥形区域。

  • TT:光线穿过毛发表面,发生折射进入内部,然后穿出再发生一个折射,形成一块锥形折射区域。

  • TRT:穿过第一层表面折射后,在第二层的内壁发生反射,然后再从第一层折射出去,也是一块锥形区域

    演示图片

他认为人的毛发类似于玻璃圆柱体,而头发最外面是cuticle(表皮),内部有一层cortex(皮质)

  • 皮质层会对光线有不同程度的吸收,黑发吸收多,金发吸收少

  • 皮质层的色素含量决定发色

    演示图片

应用

演示图片

演示图片

演示图片

一根毛发不仅要考虑直接光,还要考虑别的毛发反射过来的光线。一条路径可能就要经过几百上千根毛发。所以想要得到很好的渲染结果,计算量要求及其大。

(3)动物皮毛(Animal Fur Appearance)

用渲染人的头发的模型去渲染动物的毛发,并不能得到想要的效果,所以需要定义新的方法渲染动物皮毛

演示图片

人类头发 vs 动物皮毛

  • 相同:都分为三层结构:表皮、皮质、髓质(之前的玻璃柱模型忽略了这一层)

  • 不同:人类毛发髓质比较少,动物的髓质特别厚,光线进去更容易发生散射

    演示图片

    把髓质加入考虑之后,渲染效果提升很大

    演示图片

(4)双层圆柱模型(Double Cylinder Model)

某些,在Marschner Model 的基础上考虑了髓质,从而提出的模型。

演示图片

演示图片

双层圆柱模型因其强大真实的渲染结果,在工业界得到非常广泛的应用

其代表有:猩球崛起、狮子王

颗粒状材质(Granular Material)

计算量非常大,因此并没有广泛应用

演示图片

演示图片

表面模型(Surface Models)

半透明材质(Translucent Material)

演示图片

演示图片

次表面散射(Subsurface Scattering):光线从一个点进入材质,在表面的下方(内部)经过多次散射后,从其他一些点射出

演示图片

  • 双向次表面散射反射分布函数(BSSRDF):是对BRDF概念的延伸,某个点出射的Radiance是其他点的入射Radiance贡献的

    S(xi, ωi, xo, ωo):可以返回给定入射点xi和入射光方向ωi,在目标着色点xo的ωo方向的比例是多少。

BRDF f(ωi, ωo) :入射和出射都是同一个点,BSSRDF :入射和出射是不同的点(SS是次表面散射缩写)

  • 次表面散射渲染方程

    对具有次表面散射性质的表面材质,欲求解某个着色点在相机方向的Radiance,不仅要对该点的半球面上入射光的积分,还要考虑对该表面其他点的不同入射方向的光进行积分。

    演示图片

以上计算比较复杂,因此又有一种近似的方法被提出

Dipole Approximation

  • 引入两个点光源来近似达到次表面散射的效果

    演示图片

次表面散模型的渲染结果如下:

演示图片

演示图片

演示图片

演示图片

布料材质(Cloth)

  1. 看做一个做表面,忽略细节进行渲染

演示图片

2. 看做参与介质进行渲染

演示图片

3.看做是把实际的纤维在空间中一个个渲染出来,计算量非常大

演示图片

细节表面

为了生成更加真实的表面,可以把法线的分布用更多细节的分布来表现,就会生成如下图中的效果,但是生成过程非常慢

演示图片

演示图片

演示图片

有些物体过于小的时候,就不能用几何光学去解释了,就需要让光延波长去传播,也就是波动光学

演示图片

演示图片

演示图片

程序化生成

通过噪声函数可以传入坐标直接查询到对应的值(f(x, y,z))

演示图片

演示图片

演示图片

可以生成地形,水波,木头上年轮等细节