GAMES101现代计算机图形学入门-闫令琪-随堂笔记-Lecture 18 Advanced Topics in Rendering

写在前面:原始文案来源于凌风同学博客,本文在其基础上增加图片并对文案稍作修改。此系列文章已经私信咨询能否授权发布,但一直尚未得到本人回复。出于工作要求,本人需要记录该系列课程体系,以供后期交流学习使用,不得已在此公开。特在此严谨声明,该系列文章不以盈利为目的,侵权麻烦私信即可删除。

Lecture 18 Advanced Topics in Rendering

一.Advanced Light Transport(其他光线传播方式)

无偏(Unbiased):蒙特卡洛积分估计出来的结果的期望(无论用多少样本)永远都是我们要的真实值(期望永远是对的)

有偏(Biased):所有其他情况都是有偏。估计出来的期望和实际的值不一样。

虽然取多少样本,得到的结果都是有偏的,但是,在一个极限的定义下,用的样本数足够多,期望值会收敛到正确值。这时候我们称这个值是一致(consistent)。

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

双向路径追踪(无偏):生成两个不同的半路径(子路径),一个是从光源出发的半路径,另一个是从摄像机出发的半路径,把两条半路径的端点连起来(如下图虚线部分)。
在这里插入图片描述
双向路径追踪实现起来非常复杂,但是在一些情况下渲染出来的结果很好。如下图场景。这个场景里光源仅仅往一个角落里打,那么实际上整个场景几乎都是被间接光所照亮的,再加上整个场景几乎都是漫反射材质,光线打上去会往各个方向弹,那么如果这时候用路径追踪,就不容易弹到光源处。那么这时候用路径追踪就很难照亮整个场景。这时候用双向路径追踪,在光源处发出一些光线打到场景中,再从相机发出一些光线打到场景中,把他们端点连起来,就会得到一些很合理的路径。(但是BDPT算起来比较慢)
在这里插入图片描述

(二)Metropolis Light Transport (MLT)

MLT(无偏)用统计学上一个采样的工具:马尔科夫链。马尔科夫链可以根据一个样本生成靠近它的另一个样本。他可以以任意函数的形状为PDF生成样本,使得这一系列样本的分布与被积函数形状一致。在这里插入图片描述
那么将其应用在产生路径上,在给定一个路径的情况下,可以在周围产生很多与其相似的路径(一个局部的方法)。如上图中,已经生成一条蓝色的光路,对其进行一些微小的扰动,就形成了一条新的红色路径
在这里插入图片描述
MLT特别适合做光路传播复杂的计算。因为只需要找出一条光线的路径,就可以以其为种子,生成更多路径 如上图,左侧图的光线仅仅从门缝出来,照亮整个场景,光路复杂;右侧图是水波,光线在水中的传播,会产生焦散现象,光线聚集,光路也极其复杂。

但是其也有坏处。
MLT方法很难在理论上分析其最后收敛的速度(什么时候变成没有噪声的),由于所有操作都是局部的,也就是说每个像素自己做自己的,那么最后有一些像素收敛的快,有一些像素收敛的慢,得到的渲染图看上去就会比较脏(如下图)。那么用这种方法渲染动画就不可以。
在这里插入图片描述

(三)Photon Mapping(光子映射)

光子映射(有偏),特别适合用来渲染caustics(焦散)(如下图)
在这里插入图片描述
第一步,光子(光线)从光源出发,在空间中碰到物体该反射还是反射,该折射还是折射,直到碰到diffuse(漫反射)物体,就停下来。当这一步做完后,就可以把所有光子整理起来,就知道了各个光子在哪里。
在这里插入图片描述
第二步,光子(光线)从摄像机出发,与第一步一样,在空间中碰到物体该反射还是反射,该折射还是折射,直到碰到diffuse(漫反射)物体,就停下来。当这一步做完后,也可以把所有光子整理起来。

最后一步,把前两步合起来,就可以做一个局部的密度估计。建立在观察的角度上去看哪部分亮哪部分暗,那么光子分布越集中的地方就会越亮。
在这里插入图片描述
局部密度估计:对于任何一个点,取其最近的N个光子,找到后去求这N个光子所占的面的面积,那么光子的密度就是用N除以面积。那么N取多少?取小了图片噪声会很明显,取大了得到的结果会模糊。为什么会模糊?也就是为什么这种方式是有偏的

在做密度估计时,我们想算的密度应该是当前一个点周围取一个微小的面积dA,里面有dN个光子,即 dN / dA,但是我们实际上算的密度是ΔA面积中有ΔN个光子,即 ΔN / ΔA。正常情况下两者很接近,但绝对不是相等的,所以对密度的估计是一个不对的估计,只有当dA无限小才会趋向于正确。那么何时ΔA会无限小?只有当打出的光子数无限大的时候,有更多的光子被打在面上,那么得到一个着色点周围同样数量N的光子覆盖的面积才会无限小。这时才会更接近dA。也就是当有无限多数量的光子时,才会接近正确的结果,因此是一个有偏但是一致的方法,所以会糊。
在这里插入图片描述
那么由此我们可以得出一种判断有偏和一致的方法:和正确的结果相比,如果得到的结果有任何一点的模糊,那就是有偏的;

如果虽然是模糊的,但是只要样本足够多,最后就会收敛到不模糊的结果,那么就是一致的。

(四)Vertex Connection and Merging(VCM)

VCM的思想是把双向路径追踪与光子映射结合起来。在做BDPT时,双向发出来的认为是光子,如果两个光子相邻很近(如下图,在一个局部的面里),那么这时候就用光子映射,将这两部分的sub-path结合在一块儿,从而得到了更好的结果。
在这里插入图片描述

(五)Instant Radiosity (IR实时辐射度算法)

由于我们一般不区分光线是反射来的还是光源发出来的,都是Radiance,那么对于已经被照亮的地方,都可以认为是光源,再用他们去照亮别的东西。

首先先从光源打出很多light sub-paths,然后会停在某些地方,我认为这些地方变成了新的光源(VPL) 。再看向这个场景的时候用这些VPL去照亮着色点。
在这里插入图片描述
如下图,左图可以看出IR的思想,是用“一堆光源”再去照亮整个场景。
右图是IR存在的问题,有一些地方莫名其妙会发光。(在前面我们提到把对立体角的采样改成对面积的采样的地方,这里与距离平方项有关系,当两点间距离极近,那么除以了一个极接近0的数,得到的结果就非常大,就出现了问题)
在这里插入图片描述
但是这种方法无法做glossy材质。

一.Advanced Appearance Modeling(材质建模)

(一)Non-Surface Models

1.Participating Media(Fog、Cloud)

在这里插入图片描述
在这里插入图片描述
对于云、雾这种材质,当光线穿进去以后,会打到很多小的冰晶,这些结晶会把光线散射到各个方向去同样传播过程中也会接收到各个方向来的光。有些光在传播过程中就被慢慢吸收了。
在这里插入图片描述
那么光线如何散射?通过一个相位函数。相位函数决定了光是均匀散射还是向前或向后散射
在这里插入图片描述
首先考虑光能走多远,然后停下来。当停下来以后,考虑把光线往哪个方向散射。整个过程中会有各个方向的散射。
在这里插入图片描述

2.Hair Appearance(头发)

在这里插入图片描述
在渲染头发时,我们考虑的就不是光与面的作用了,而是光和曲线如何作用。如上图,对于头发来说,会有高光,一种是无色的(白色)高光,另一种是有色的高光。

(1)Kajiya-Kay Model

在这里插入图片描述
这是一种简单的模型,光线打到圆柱上往四面八方反射,我们考虑会散射出一个圆锥。
在这里插入图片描述
但是这种方式渲染出来的头发显然不是很好。

(2)Marschner Model

在这里插入图片描述
于是又有了这种模拟真实头发与光作用的模型,当光线打到圆柱时,一部分光被直接反射(R),另一部分会穿到头发里去(T)发生折射然后再穿出来(T)(穿进去穿出来总称为TT),还有一部分穿进去在下表面发生了一次内部反射然后再从上表面穿出来(TRT)。通过这种方式可以定义不同的光线传播
①Glass-like cylinder
在这里插入图片描述
将头发当成玻璃圆柱,分为内外两层结构,内部有色素
②3 types of light interactions: R, TT, TRT (R: reflection, T: transmission)
在这里插入图片描述
考虑三种光线与圆柱的作用

综合考虑这两种情况,就可以得到很好的渲染结果
在这里插入图片描述

3.Fur Appearance(毛皮)

如果用人的毛发渲染方式去渲染动物的毛发,渲染结果显然不对。
在这里插入图片描述
人的毛发和动物毛发区别最大的是最中间的髓质Medulla,动物毛发的髓质非常大,在内部更容易发生散射。因此无论是人还是动物的毛发,模拟髓质的散射是有必要的,之前玻璃柱模型忽略髓质是不对的。
在这里插入图片描述
Importance of Medulla
在这里插入图片描述
可以看到,当给人的头发加上髓质的模拟渲染后,效果会更进一步。
在这里插入图片描述
所以就有了双层圆柱模型(精准地描述髓质)
在这里插入图片描述
一部分光跟以前的一样,还有一部分在穿过髓质的过程中被发散到各个方向去,还有可能再被反射回去…
在这里插入图片描述
引入五种不同描述光线传播的方法,得到的结果如下图所示。
在这里插入图片描述

4.Granular Material(颗粒)

一堆小东西形成的一个表面模型(糖、盐、沙子…)(颗粒材质)
在这里插入图片描述
比如这个沙子堆成的城堡,认为每一个单元有好多不同的石子以不同的成分比例构成,再渲染。
在这里插入图片描述
在这里插入图片描述

(二)Surface Models

1.Subsurface Scattering(半透明)

光线可以从某一个地方进这个表面,再从某一个地方出去(玉石&水母)
在这里插入图片描述
在这里插入图片描述
次表面散射:反应在物理上即为光从一个点进入物体,在物体内部经过多次散射后穿出。可以是BRDF概念上的一个延伸。
在这里插入图片描述

(1)BSSRDF: BRDF的延伸, 由于另一点的入射差分辐照度,某一点的出射辐射度

在这里插入图片描述
描述从一个点xi以一个方向ωi进来,再从另一个点xo以另一个方向出去ωo

相应的渲染方程也要改变,既要对方向积分,也要对面积积分。
在这里插入图片描述

(2)Approximate light diffusion by introducing two point sources.

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

(3)BRDF vs BSSRDF

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.Cloth(布料)

布料是一系列缠绕的纤维构成的,不同纤维通过第一次缠绕会形成股ply,不同股缠绕会形成线fiber,线可以织成布cloth。布料的渲染有三种方法:
在这里插入图片描述

(1)Cloth: Render as Surface

布料与织布时的编织图案有关(叠压方式),根据不同的编织图案结合BRDF就可以得出不同的渲染样子。
在这里插入图片描述

(2)Cloth: Render as Actual Fibers

但是BRDF是针对平面材质的,对于天鹅绒这种材质,实际上是分布在空间中的体积,因此就无法用BRDF渲染。
在这里插入图片描述
因此另一种方式就是把空间分成非常小的格子,每个格子我们知道内部纤维朝向分布和复杂程度,将这些性质转化为光的吸收和散射,就好像是在渲染云雾等一样,把布料当成体积。
在这里插入图片描述

(3)Render every fiber explicitly!

还有一种方式就是用最暴力的做法,把每一根纤维都渲染出来。
在这里插入图片描述

3.Detailed Appearance(真实细节)

在这里插入图片描述
由于上面两幅图太过完美,所以看上去反而不真实。
在这里插入图片描述
真实的物体往往都是有不同的划痕,是不完美的。

(1)Recap: Microfacet BRDF

在这里插入图片描述
Surface = Specular microfacets + statistical normals
在这里插入图片描述
在渲染中,最重要的就是微表面的法线分布。

(2)Statistical NDF vs. Actual NDF

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

(3)Define details

在这里插入图片描述
可以用一张很大的法线贴图,来表现细节
在这里插入图片描述
但是这种渲染方式太慢了!

(4)Difficult path sampling problem

在这里插入图片描述
由于微表面放大后是一个个小的镜面,从摄像机发出来的光线经过镜面以后很难打到光源上去,从光源打过来的也一样,很难反射到摄像机。

(5)Solution: BRDF over a pixel

在这里插入图片描述
所以这里可以考虑一个像素会覆盖很多微表面,把一个小的范围之内的微表面的法线分布算出来,这样就可以替代原来光滑的分布,用在微表面模型里。

(6)p-NDFs have sharp features

在这里插入图片描述
不同范围会产生不同的效果

(7)p-NDF shapes

在这里插入图片描述

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

(8)Recent Trend: Wave Optics

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

由于波动光学,实际看到的效果是彩色的

在这里插入图片描述
在这里插入图片描述

(9)Detailed Material under Wave Optics

在这里插入图片描述
考虑用波动光学算出BRDF。波动光学和几何光学得到的BRDF是差不多的,但是波动光学得到的BRDF又有不连续的特点(光的干涉会使有的地方加强有的地方减弱,产生一条条的样子)

4.Procedural Appearance(程序生成的材质)

我们可以定义没有纹理的细节吗?
-是的! 即时计算噪声函数。
在这里插入图片描述
–3D 噪声 -> 内部结构如果被切割或损坏
– 阈值处理(噪声 -> 二进制噪声)

在这里插入图片描述
用一些三维空间中的噪声函数。给空间中任何一个x,y,z,可以返回一个值,随用随取。
在这里插入图片描述

(1)Complex noise functions can be very powerful

利用强大的噪声函数可以创造出很多东西,如程序化生成的山和波浪。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值