久违的101图形学回归咯
今天的话题应该是比较轻松的:聊一聊在渲染中比较先进的topics
Advanced Light Transport
首先是介绍一系列比较先进的光线传播方法,有无偏的如BDPT(双向路径追踪),MLT(梅特罗波利斯光传输)(好长的名字),有偏的如光子映射与VCM(顶点连接合并)以及一些实时辐射度方法如VPL等。
既然上文提到了有偏和无偏,那什么才是有偏的,什么才是无偏的呢?
之前我们提到的蒙特卡洛积分中,我们都知道提高采样率能有效提高准确率,但是如果我们发现无论如何提高采样率我们的期望都是相同的值:那就说明这是无偏估计的方法;否则,就是有偏估计。
BDPT
双向的路径追踪我们可以认为就是原来的路径追踪的扩展版:在原来的路径追踪里,我们从摄像机发射一束光线,直至连接至光源,而双向的路径追踪则是从摄像机和光源都发射光线,然后我们将这两根光线的某一端点连接起来,就实现了我们的双向路径追踪。
由图可知:双向路径追踪适合光线传播情况复杂的情景:因为在如图的灯中,光从灯上方被大量地打出,很难找到一条清晰的包含主要能量的光路。
缺点在于:双向路径追踪比较慢,且实现很复杂。
MLT
MLT是基于统计学的一项工具:马尔可夫链,这项工具可以根据已有的样本生成新的样本,比较具体的例子如图:我们在已知了一条光路后,可以利用这项工具对光路里的某个具体的点位稍稍改动得到一条新的光路。
同样的,这种算法也非常适合光线复杂的场景,且由于他只需要一条正确的光路就能生成多条类似的光路,所以对于一些很复杂的情景如泳池下的涟漪这样的画面都可以渲染出来。
缺点在于:首先他的所有工作都是局部的,也就是每条光线都只会生成与自己类似的光线,每条光线都是自己忙自己的,所以本身收敛速度也不可知,且每个像素之间收敛的速度也不一,一般不用于渲染动画(连简单的画面都渲染不明白)
光子映射
光子映射是一个有偏估计方法且是一个有两个步骤的方法,对于SDS的光路渲染尤其在行(什么是SDS呢?就是光线先进入Specular材质如水面,然后再Diffuse如光线在水底,最后再进入Specular材质如水底的光线射出水面)。
光子映射有许多实现的方法,如:
我们首先从光源和摄像机都分别发射光线,任由他们反射直至撞到了diffuse的材质。
接着我们进行局部的密度估计,如何理解局部的密度估计呢?核心的思路是光子越多的区域应该更明亮。我们对于任何一个着色点,去找离他最近的n个光子,然后计算这n个光子与所占的面积的比值即可。
能够看到n的取值会直接影响结果,n如果取得太小如就取2个光子,那么就会有很多噪声(如最上面的图一样明明暗暗),可要是取得太大,又会很糊。这也就是光子估计是一个有偏估计的原因:他的期望会随着采样率的变化而变化,不过我们可以设想:当本身的光子数趋向于无穷时,我们无论取多少个点,n无论为多少,我们所取的面积都只会是很小的一块,这样也就接近了无偏估计的概念。
在这里我们也可以声明两个概念:第一是有偏的界定就是会产生模糊的现象,第二是所谓的Consistent:就是指随着采样率提高至无限后不再产生模糊现象的估计方法。这里还回答了关于局部的密度估计:为什么不是像其他的估计密度的方法一样划定一定的面积范围后在面积内统计光子的数量这样做呢?这是因为这样做的话光子估计会永远是一个有偏估计:哪怕我们有无限个光子,界定了一定的面积范围,那他对面积的积分就无法到达的量级。
VCM
接下来要介绍的是VCM的概念:顶点连接合并,他是双向路径追踪和光子映射的一个方法上的结合。这个算法的思路就是在双向路径追踪的过程中如果两条光线的端点无法连接成线,也不要浪费这两个端点,而是把这两个端点的光子当作光子映射的一部分。
IR
IR又称多光方法,简单的说我们将所有已经被照亮的地方都视作光源,这样的话当我们聚焦于某个着色点时我们只需要所有被视作光源的地方(VPL,虚拟光源)向着色点发射光线即可。
优点在于很快而且在漫反射场景表现优秀,缺点在于当虚拟的光源离着色点较近时显然效果很差。
因为当距离过近时,相当于计算光照强度时分母过小,于是会出现光照过强。
Advanced Appearance Modeling
这里提了一些更先进的外观建模,分为了无表面模型与表面模型以及程序化生成的表面。
Participating Media
散射介质如雾。
当光线遇到这些散射介质时,会发生两种情形:被吸收和被散射。
如何散射呢?我们会用一个相位函数来描述光线在散射介质中散射的情形。
散射介质如何渲染呢?原理上来说,充满着随机,随机挑选一个方向,行进随机的距离,然后再与光源连线。
Hair
头发的表现。
值得一提的是,我们能发现头发上有两种高光,一种是偏无色的高光,另一种是有色的高光。
这是我们当前的头发的模型:我们认为光线在头发的表面时,首先会发生一次反射,称为R,然后这束光线会进入头发,之后它再从头发内部出去,我们称为TT,而进入头发的光线也有可能再反射出头发,我们称为TRT。这里的T就是指光线经过头发的表面,R就是指光线发生反射。
我们可以把头发看作一个玻璃柱,同时还要考虑头发中色素的影响(黑头发吸收光线的能力就要强一点,金头发反射的能力更强一点)。
Animal fur
对人类头发的模拟能适用于动物的毛发吗?
由图可知,动物的毛发与人类的头发是有相似之处的。人类和动物的毛发都是由三部分组成,最外面一层用来反射光线,中间一层用来散射光线,最内的一层则用来吸收光线。但是细看的话不难发现;动物内部的用于散射光线的介质(髓质)的成分占比远大于人类。
于是我们在模拟动物毛发时,就可以把动物的毛发视作一个双层的圆柱体,内部的圆柱体就用来模拟髓质(这个模型是闫老师提出的)。
这是在内部的情形。
Granular
接下来介绍一下颗粒模型
这个部分貌似说的是没有很合适的方法...
之前说的都是非表面模型,接下来让我们了解下表面模型。
Translucent
透光性的材质如:玉。
所谓的透光性材质指的是当光从这种材质进入后在材质内还可以从材质表面的另一个地方出去。
当光线进入这样的材质会在材质内部发生大量的散射,我们将这样的在表面下的散射称为:次表面散射。
由此引出的BSSRDF的概念可以视作之前BRDF的概念的延伸,之前我们计算BRDF的时候往往只考虑一根光线打到表面这样一个过程,而现在次表面散射的存在告诉我们:表面上可能有多个光,其中部分光可以是从介质内部投射出来,因此我们需要加入对方向和面积的考虑。
我们可以将这样的现象想象成:当我们有一个光源在这个表面的正上方时,这个介质内也有一个类似的光源将光线进入介质的周围点亮,我们就通过这样的方法来模拟这样的情景。
Cloth
布料:由一系列纤维缠绕组成。
一般的,我们将布料认作是一个平面上一系列细而平的线条的组合即可。
可缺陷在于:如果遇到并不是在一个平面内的纤维组成的布料如图二,我们这样的方法行不通。
比较合理的做法是我们不再拘泥于平面而直接采用体积渲染,将布料分作很多个独立的小块。这样当然可以得到最理想逼真的结果,但是这样的计算量将大到难以估计。
当然,我们也可以直接渲染出纤维(一根根立方体),但这样的计算量也很惊人。
后续还聊了些有关细节渲染的东西,我看了一下,这节课的内容总的来说是了解为主,暂时对我们的学习没有啥帮助,我也就不浪费时间了(小偷一手懒)。