GAMES101-18:渲染中的高级板块

前言

GAMES101-18:渲染中的高级内容(仅作了解,不涉及细节):光线传播计算、外观材质、程序化生成

高级光线传播

  • 有偏光线传播
    • 双向路径追踪 BDPT
    • MLT
  • 无偏光线传播
    • 光子映射 Photo Mapping
    • VCM
  • IR

无偏:蒙特卡洛积分不会引起系统误差,无论样本多少,期望都是正确的。反之则是有偏的。

双向路径追踪 BDPT

路径追踪:从相机打射线追踪到光源。双向路径追踪会先从相机和光源打出一些“半路径”,然后再连接这些半路径。

BDPT 在有的情况下表现比路径追踪好很多(例如光源是对着天花板打的灯,场景全是间接光)。但是相对的速度很慢,写对很难。

Metropolis 光线传播,Metropolis Light Transport,MLT

Metropolis 是人名,姑且不译。

应用马尔科夫链蒙特卡洛积分(MCMC),马尔科夫链是一种采样方法,它可以根据当前样本生成靠近的新样本。这样,对于困难的光路,它也可以在局部不断进行探索最后得到新的路径,最后得到最佳概率密度函数(f(x)形状p(x)时)。

MLT 对于复杂光路处理非常好(例如游泳池波浪在水底聚焦的波纹,caustics 现象),因为只要有一个随便的函数就可以得到更多的形状。

缺点则有:难以估计收敛速度;像素之间没有关系,收敛速度不一;因此而得到脏结果;也因为像素不一定会每一帧都收敛,导致一般不用于动画渲染,会导致画面抖动。

光子映射

有多种方法。

步骤1:光子不断反射折射,直到打到漫反射的表面停下。记录下表面的光子数。

步骤2:摄像机打出射线不断反射折射,直到遇见漫反射表面停下。

然后进行计算,计算局部密度估计(local density estimation) :找到射线附近最近的 N 个光子,计算它们占据的面积大小(密度)。因为我们知道,光子越多越密就应该越亮。

如果 N 过小,则结果噪声大;如果 N 过大,则结果会变糊。

光子映射是有偏的,因为光子数量有限,我们是用不无限小的面积 ΔA 去替代了无限小的面积 dA(数量 N 也是同理)。但是它是“一致的”,也就是极限(光子无穷多)的情况下结果是正确的。

为什么我们是找 N 个光子占的面积而不是找 A 面积内的光子数量?

因为后者是有偏且不一致的:随着光子数量的增加,结果不会收敛的正确结果。

VCM(顶点连接与扩展)

结合 BDPT 和光子映射。

BDPT 打出的两边的半路径非常接近但是没有连接,就用光子映射的办法去它们作为光子收集起来发挥作用。

实时辐射度 Instant Radiosity

把反射光的平面看成新的光源。

缺点则有有的时候会有异常亮点,不能处理抛光面等。

高级外观(Appearance)模型

  • 非表面模型
    • 散射介质/参与介质:云雾
    • 毛发、纤维
    • 颗粒材质
  • 表面模型
    • 透光材质
    • 布料(cloth)
  • 程序化生成模型

散射介质

云雾会在传播过程中会被吸收也会被散射(往各个方向随机打)。

相位函数类似于 BRDF 决定了光怎样散射(均匀?主要前向?主要后散?)。

渲染:随机选一个弹射方向随机走一段距离,最后连到摄像机。

不是只有云雾才是散射介质,例如手电筒的光照亮捂在上面的手,这里光进入了手一定距离,这里手就是散射介质。

毛发外观

人头发

头发表面会有两种高光,无色的(漫画上的白光带)与有色的。

Kajiya-Kay 模型:效果不好。

Marshner Model:把头发局部视为玻璃圆柱,分为 cortex(表面) 和 cuticle(内部),并且表面会吸收光,内部会有色素。综合考虑 R(反射)、TT(两次折射)、TRT(折射反射折射)。

光会真的在一根根的头发中和头发间折射反射,计算量巨大。

动物毛发

人头发模型运用于动物毛发得到的结果是不对的。

因为毛发的最内层是 Medulla((毛)髓质),毛髓会发生散射现象,类似散射介质。而动物毛发的毛髓比人头发大得多。

因此,我们需要模拟毛髓。

进一步地我们也可以在人的头发上模拟(比动物毛发小的)毛髓,得到更真实更亮的头发。

同样用玻璃柱模拟毛髓,这就是更好的双玻璃柱模型。

颗粒材质(granular material)

一粒一粒的,例如盐、香料、沙子……

可以将其视为一个个单元;然后再分析成分、渲染。

非常耗时间,应用不多。

透光材质(Translucent)

透光(Translucent)往往被翻译成半透明,但并不是半透明。这种性质的原理在于散射,使得光能透过,但是并不能由此看到什么。

例如捂住手电筒的手附近、玉、水母

为此我们引入次表面散射(BSSRDF)的概念,这是对 BRDF 概念的拓展,从一个点一个方向进入的光可以从另外一个点另外一个方向出去,记 S(xi,ωi,xo,ωo)S(x_i,\omega_i,x_o,\omega_o)

Dipole 近似:在发生 BSSRDF 表面的地方上下加入两个光源,从而用 BRDF 近似 BSSRDF。

人的皮肤、大理石等等都会发生散射,因此使用 BSSRDF 都会得到更好的效果。

布料材质

纤维(fiber)绕成一股股(Ply),股再缠绕形成线(yarn),最后被织成布料。

渲染:BRDF 面;当成微小的体积单元,根据编织性质确定吸收和散射,向散射介质一样渲染(好,但是计算量大);更暴力地,像头发一样渲染纤维。

细节外观

现实世界不是绝对完美的,有各种细节上的瑕疵,这反而使得我们的渲染结果不够真实。

如果我们使用的法线贴图(normal map)是完美线性的,就不够真实,如果每个法线既符合整体规律又有自己的特点,就更真实。

这样的微表面渲染非常困难,因为表面太小有太多无法从光源命中摄像机的路径。解决的办法是我们可以把一个像素覆盖的微表面找出来,计算这个像素在各个方向的 BRDF。如果覆盖像素多,则有总体的效果,覆盖的少,就有个体的性质。

如果表面极小,小到接近光波,那么就会需要考虑波动光学来计算 BRDF。

程序化生成的外观

如果我们存储三维空间的纹理,那就太复杂,太占空间了。我们可以用噪声函数,不存储,只在需要用的时候算出来该点的值即可。

一些噪声函数的应用:地形生成、水面生成、木头内外的年轮纹理等等。

跳转

Home:GAMES101-1:课程总览与笔记导航

Prev:GAMES101-17:基于物理的材质(BRDF)

Next:GAMES101-19:摄像机、透镜、光场