全局光照(简述)

一、什么是全局光照

全局光照(Global Illumination,简称 GI), 作为图形学中比较酷的概念之一,是指既考虑场景中来自光源的直接光照,又考虑经过场景中其他物体反射后的间接光照的一种渲染技术。

即可以理解为:全局光照 = 直接光照(Direct Light) + 间接光照(Indirect Light) 图1 Direct illumination (原图连接) 图2 Global illumination = Direct illumination +Indirect illumination

虽说实际应用中只有漫反射全局照明的模拟算法被称为全局照明算法,但其实理论上说反射、折射、阴影都属于全局光照的范畴,因为模拟它们的时候不仅仅要考虑光源对物体的直接作用还要考虑物体与物体之间的相互作用。也是因为,镜面反射、折射、阴影一般不需要进行复杂的光照方程求解,也不需要进行迭代的计算。因此,这些部分的算法已经十分高效,甚至可以做到实时。不同于镜面反射,光的漫反射表面反弹时的方向是近似“随机”,因此不能用简单的光线跟踪得到反射的结果,往往需要利用多种方法进行多次迭代,直到光能分布达到一个基本平衡的状态。 实际应用中只有漫反射全局照明的模拟算法被称为全局照明算法 PBR中的BRDF主要模拟的是镜面高光,漫反射通常使用Lambert着色方程模拟

二、全局光照的主要算法流派

经过几十年的发展,全局光照现今已有多种实现方向,常见的全局光照主要流派列举如下:

Ray tracing 光线追踪 [1968]Path tracing 路径追踪 [1986]Photon mapping 光子映射Point Based Global Illumination 基于点的全局光照Radiosity 辐射度Metropolis light transport 梅特波利斯光照传输Spherical harmonic lighting 球谐光照Ambient occlusion 环境光遮蔽Voxel-based Global Illumination 基于体素的全局光照Light Propagation Volumes Global IlluminationDeferred Radiance Transfer Global IlluminationDeep G-Buffer based Global Illumination等。

三、渲染方程 The Rendering Equation [1986]

在前人的研究基础上,Kajiya于1986年进一步建立了渲染方程的理论,并使用它来解释光能传输的产生的各种现象。这一方程描述了场景中光能传输达到稳定状态以后,物体表面某个点在某个方向上的辐射率(Radiance)与入射辐射亮度等的关系。

可以将渲染方程理解为全局光照算法的基础,Kajiya在1986年第一次将渲染方程引入图形学后,随后出现的很多全局光照的算法,都是以渲染方程为基础,对其进行简化的求解,以达到优化性能的目的。渲染方程根据光的物理学原理,以及能量守恒定律,完美地描述了光能在场景中的传播。很多真实感渲染技术都是对它的一个近似。渲染方程在数学上的表示如下: 图 渲染方程描述了从x点沿某一方向看的光放射的总额。

四、光线投射 Ray Casting [1968]

光线投射(Ray Casting),作为光线追踪算法中的第一步,其理念起源于1968年,由Arthur Appel在一篇名为《 Some techniques for shading machine rendering of solids》的文章中提出。其具体思路是从每一个像素射出一条射线,然后找到最接近的物体挡住射线的路径,而视平面上每个像素的颜色取决于从可见光表面产生的亮度。

五、光线追踪 Ray Tracing [1979]

1979年,Turner Whitted在光线投射的基础上,加入光与物体表面的交互,让光线在物体表面沿着反射,折射以及散射方式上继续传播,直到与光源相交。这一方法后来也被称为经典光线跟踪方法、递归式光线追踪(Recursive Ray Tracing)方法,或 Whitted-style 光线跟踪方法。

光线追踪方法主要思想是从视点向成像平面上的像素发射光线,找到与该光线相交的最近物体的交点,如果该点处的表面是散射面,则计算光源直接照射该点产生的颜色;如果该点处表面是镜面或折射面,则继续向反射或折射方向跟踪另一条光线,如此递归下去,直到光线逃逸出场景或达到设定的最大递归深度。

一般的光线追踪算法有两大缺点,一是表面属性比较单一,很难去丰富光接触到物体表面以后发生的多种光学效应,二是忽略了漫反射。我们可以通过模型修正的方式来缓解,首先,物体的表面属性是混合的,比如它有一部分是反射,一部分折射,一部分漫反射。我们这么理解各个部分:当光线接触该表面以后,有一定概率发生反射,折射和漫反射。发生这些光学效应的概率我们可以事先定义好。然后我们多次计算光线跟踪,每次按照概率决定光线的反射属性,就能把各种光学效应都考虑进去。

以下这张图示可以很好的说明光线追踪方法的思路: 图 Ray Tracing Illustration First Bounce

图 典型效果图

光线追踪的伪代码:

for each pixel of the screen

{

Final color = 0;

Ray = { starting point, direction };

Repeat

{

for each object in the scene

{

determine closest ray object/intersection;

}

if intersection exists

{

for each light inthe scene

{

if the light is not in shadow of anotherobject

{

addthis light contribution to computed color;

}

}

}

Final color = Final color + computed color * previous reflectionfactor;

reflection factor = reflection factor * surface reflectionproperty;

increment depth;

} until reflection factor is 0 or maximumdepth is reached

}

六、路径追踪 Path Tracing [1986]

Kajiya也于1986年提出了路径追踪算法的理念,开创了基于蒙特卡洛的全局光照这一领域。根据渲染方程, Kajiya 提出的路径追踪方法是第一个无偏(Unbiased)的渲染方法。路径追踪的基本思想是从视点发出一条光线,光线与物体表面相交时根据表面的材质属性继续采样一个方向,发出另一条光线,如此迭代,直到光线打到光源上(或逃逸出场景),然后用蒙特卡洛的方法,计算其贡献,作为像素的颜色值。

路径追踪 = 光线追踪+ 蒙特卡洛方法

具体算法流程:(1)从视点出发,到成像平面上的每一个像素向场景发出一条虚拟的光线。 (2)当光线与物体相交时按照概率确定光学效应,即是折射,反射还是散射(漫反射)。 (3)根据不同的光学效应继续跟踪和计算,直到得到最终结果。如果光学效应为漫反射,随机选择一个反射方向进行跟踪。 (4)重复前面的过程,把每次渲染出来的图像像素叠加混合,直到渲染出的结果达到满意程度。

【转】MonteCarloPathTracing的参考代码链接 https://github.com/ybbbbt/MonteCarloPathTracing 很香,真实可用,环境也配好了 图 蒙特卡洛法多次迭代的渲染图 图 基于路径追踪渲染的效果图

六、光线投射(Ray Casting ),光线追踪(Ray Tracing),路径追踪(Path Tracing)三者的的区别:

Ray Tracing:这其实是个框架,而不是个方法。符合这个框架的都叫raytracing。这个框架就是从视点发射ray,与物体相交就根据规则反射、折射或吸收。遇到光源或者走太远就停住。一般来说运算量不小。Ray Casting:其实这个和volumetric可以脱钩。它就是ray tracing的第一步,发射光线,与物体相交。这个可以做的很快,在Doom 1里用它来做遮挡。Path Tracing:是ray tracing + 蒙特卡洛法。在相交后会选一个随机方向继续跟踪,并根据BRDF计算颜色。运算量也不小。还有一些小分类,比如Bidirectional path tracing。

参考文献:

1、【《Real-Time Rendering 3rd》 提炼总结】(八) 第九章 · 全局光照:光线追踪、路径追踪与GI技术进化编年史 2、光线投射,光线追踪与路径追踪的概念与区别 3、蒙特卡洛光线追踪 4、蒙特卡洛光线追踪 计算机图形学冬季作业

[an error occurred while processing the directive]