大触教程 | GI的算法简介

发布日期: 2018-01-03 10:02:12 阅读量:
云粉儿

渲染 大触教程 全局照明

 
全局照明中最重要的概念莫过于无/有偏差渲染算法,希望本文能够帮助大家对CG技术有更深入的了解。
 
一、什么是全局照明(Global Illumination)
 
我们首先来看两张图片A和B:
 
 
 
我们可以看到,在图片B中,白色墙反射了红色和绿色,光透过玻璃球后产生了折射形成了焦散(caustic),由于早期的光照模型属于简单光照模型和局部光照模型,因此不能够真实的还原光照效果,A就是早期的光照模型

如果要还原真实的光照效果B,就必须计算全局照明(Global Illumination)渲染器要完成直接光照和间接光照。
 
在1986年,Jim Kjiya写了一篇论文叫做《render equation》,基于几何光学的角度发明了一种全新的光照模型——全局照明(Global Illumination),虽然依然不能完整的模拟真实的物理光学,比如这个方程不能计算衍射、干涉和两极分化等光学的波动现象。但是对于CG技术,这近乎是质的飞跃。(渲染器中的焦散是一种散射模拟,并不是真实的折射计算,实际上能量守恒也是近似模拟出来的。)

 
 
 
既然已经知道了计算的方程,我们总要解方程吧,解方程就需要解方程的算法,算法就是要完成一件事情所需要的若干步骤,那么根据每个人的喜好,每个人都有自己的方式,可以说,解这个方程的算法其实有很多种的
 
其中最早的算法就是用蒙特卡罗随机方法计算路径追踪(path tracing),蒙特卡罗方法是一种随机方法,路径追踪是一种数学模型,首先你要模拟光的球面波的这种分布形式,所以你需要随机的方法;其次摄像机画面所对应的像素要计算最后的RGB和Alpha值,所以你要追踪光子的路径,它究竟撞到了哪个几何体,应该怎么反射,应该携带哪种颜色,应该如何衰减,最后返回到摄像机中,给予像素一个明确的答案。
 
 
 
这里顺便插一句,游戏里也有全局照明,不过游戏的全局照明主要是依靠IBL(基于图像的照明)球形照明技术,即给一张HDRI贴图作为光源,游戏模型的材质会对这种球形光源进行计算,因为图像本身的颜色和亮度不同,材质反射这些信息,生成略带真实感的光照效果。这种技术的优点是计算非常的快,但是它忽略了物体与物体之间的相互影响,而把每个几何体单独照明,为了使得效果更加接近真实感,游戏必须应用AO贴图,这要事先对场景进行烘焙,AO是将物体与物体间离得较近的部位染成黑色,使得不怎么反射光照,是一种常见的美术技巧。
 
 
 
二、无偏差与有偏差算法(un/biased render)

 
大家都用过V-Ray渲染器,在这个渲染器中有计算GI(全局照明)的选项,比如Brute force、Irradiance map,这些都是计算全局照明的方法。现在的渲染器都是混合渲染器,一般分为两次计算GI,然后合成在一起。小编做了一张关于这些算法的图表请大家参考。特此提醒:只有发射光子的算法才可以计算出焦散(caustic)。
 
这张图表仅参考V-Ray的算法(比如Light cache也可以是无偏差的):
 
 
也就是说,在V-Ray中,如果你想计算焦散效果,就必须开启photon map。
 
在理解这些算法之前,我们还要做一些知识的准备工作

精确和近似,你有两个苹果,哪个更大一些?简单的用眼睛和手掂量一下就知道了,但是如果你想知道精确的结果呢,那肯定是要用工具测量一下。对于我们解方程,一样存在两种方法,精确的
我们称之为无偏差算法),近似的我们称之为有偏差算法)。
 
无偏差的算法
是一种渐进式的,渲染的时候,你会看到整个画面,它会有很多噪点,然后画面越来越完整,噪点越来越少。无偏差会给出非常精确的画面,但是事实上,为了计算出每一个像素的值,你要发射无数条光线,才能覆盖每一个噪点,这个计算的速度是非常慢的,因此大家都会渲染到一半就停掉,剩下的噪点一半通过降噪插件去处理。

有偏差算法从一开始就是错的,但是随着你对参数的不断理解,有偏差也会随着你对参数的调整,生成比较真实的画面。有偏差渲染速度更快,可以分区块渲染,比如我们渲染效果图,可以几十台机器同时渲染,每台机器分得一块,所以后来也很适合GPU的并行计算,计算好的GI可以生成缓存来存放起来,下一次继续使用,节省时间。有偏差的渲染没有噪点问题,但是会占用大量的内存,GPU非常适合处理这种适合并行计算的任务,为了解决显存的问题,一般采用out-of-core Texture and Geometry的技术。
 
究竟采用哪种算法,要取决于项目,如果导演认为画面的质量非常重要,那么应当选择无偏差的算法,如果时间紧迫优先考虑产能问题,那就应该选择有偏差的算法。
 
无偏差的最常见的算法:Brute Force,理解起来也比较简单,蛮力。为了节省资源,初次反弹只包含了摄像机可见范围和需要折射反射的表面,追踪多条光线,二次反射会计算前一个shade point是否被用过了,如果用过的话,只跟踪一条光线。

最推荐的一种组合是:brute force GI + photon mapping or light cache in V-Ray。

既能保证质量,又不影响速度。

发射和收集的意思是,光子是从光源开始的,还是从摄像机或者几何体开始的。从光源开始的好处在于你可以准确的模拟焦散的效果,从摄像机或者几何体开始的好处在于避开那些摄像机看不到的画面,不用全部都计算,节省时间。

这里特别提醒一下,有偏差的算法都提供保存光子缓存的功能,不过photon mapping的这种模式只能提供view-dependent的光子缓存,我们就理解成一张二维的光子贴图就好了。其他的两种算法不仅提供view-dependent的光子缓存,还提供view-independent的。

现在我们来具体理解这些算法:
       

Light Cache会追踪很多条初次入射的光线,并给每条光线进行分类并储存样本。比如图中红色的那条样本,如果检测到,碰撞的几何体依然和原来的样本相同,那么就直接调用样本光线的结果,而不是重新进行反弹的计算,如果遇到新的几何体,就创造新的样本,以此类推。
          
Irradiance Map叫发光贴图,或者辐照度贴图,其原理是把各种材质的初次反射样本收集起来。不同的点,因为其位置和角度,也会有不同的变化,因此可以非常快速的创造初次反射效果,但是二次反射效果是没有的。
 
Phonton Map的原理也比较好理解,从光源发射光子就好了,只是如果是有偏差的算法,还是需要创造样本,摄像机会采样一些光源光线路径,然后对一定半径内的效果直接使用样本替代,所以你看到这种算的结果,往往有很多大的或者小的光斑。

不管哪种方法,最终还是要根据你的场景进行调整,经过实验获得性价比最高的组合。

活动推荐

联系客服