源自《Real-Time Rendering 3rd》,此书被称为渲染中的“九阴真经”和毛星云的文章,结合做的总结,感谢
下面是正文
全局光照在离线渲染中常用,实时渲染也是利用预渲染,将知识按照自己的理解方式归纳总结以便查阅
全局光照 = 直接光照(Direct Light) + 间接光照(Indirect Light)
可以分为以下方向:
Ray tracing 光线追踪
Path tracing 路径追踪
Photon mapping 光子映射
Point Based Global Illumination 基于点的全局光照
Radiosity 辐射度
Metropolis light transport 梅特波利斯光照传输
Spherical harmonic lighting 球谐光照
Ambient occlusion 环境光遮蔽
Voxel-based Global Illumination 基于体素的全局光照
Light Propagation Volumes Global Illumination
Deferred Radiance Transfer Global Illumination
Deep G-Buffer based Global Illumination
光线追踪(Ray Tracing)
又分为
递归式光线追踪(Whitted-style Ray Tracing),
分布式光线追踪(DistributionRay Tracing),
蒙特卡洛光线追踪(Monte Carlo Ray Tracing)。
路径追踪(Path tracing)又分为
蒙特卡洛路径追踪(Monte Carlo Path Tracing),
双向路径追踪(Bidirectional Path Tracing),
能量再分配路径追踪(Energy Redistribution Path Tracing)。
路径追踪,就是基于光线追踪,结合了蒙特卡洛方法而成的
1.递归式光线追踪(Recursive Ray Tracing)方法:在光线投射的基础上,让光线在物体表面沿着反射,折射以及散射方式上继续传播,直到与光源相交。
主要思想:从视点向成像平面上的像素发射光线,找到与该光线相交的最近物体的交点,如果该点处的表面是散射面,则计算光源直接照射该点产生的颜色;如果该点处表面是镜面或折射面,则继续向反射或折射方向跟踪另一条光线,如此递归下去,直到光线逃逸出场景或达到设定的最大递归深度。
每像素从眼睛投射射线到场景,并追踪次级光线((shadow, reflection, refraction),并结合递归
2.分布式光线跟踪算法(Distributed Ray Tracing)引入蒙特卡洛方法(Monte Carlo method)到光线跟踪领域,可以模拟更多的效果,如金属光泽、软阴影、景深( Depthof Field)、运动模糊等等。
3.路径追踪的基本思想是基于蒙特卡洛的全局光照,从视点发出一条光线,光线与物体表面相交时根据表面的材质属性继续采样一个方向,发出另一条光线,如此迭代,直到光线打到光源上(或逃逸出场景),然后用蒙特卡洛的方法,计算其贡献,作为像素的颜色值。
路径追踪 = 光线追踪+ 蒙特卡洛方法。
路径追踪渲染效果图
4.双向路径追踪(Bidirectional Path Tracing)的基本思想是同时从视点、光源打出射线,经过若干次反弹后,将视点子路径( eye path) 和光源子路径( light path) 上的顶点连接起来(连接时需要测试可见性),以快速产生很多路径。这种方法能够产生一些传统路径追踪难以采样到的光路,所以能够很有效地降低噪声。 进一步的, [Veach 1997]将渲染方程改写成对路径积分的形式,允许多种路径采样的方法来求解该积分。
5.梅特波利斯光照传输(Metropolis Light Transport)方法,路径追踪( Path Tracing)中一个核心问题就是怎样去尽可能多的采样一些贡献大的路径,而该方法可以自适应的生成贡献大的路径,简单来说它会避开贡献小的路径,而在贡献大的路径附近做更多局部的探索,通过特殊的变异方法,生成一些新的路径,这些局部的路径的贡献往往也很高。 与双向路径追踪相比, MLT 更加鲁棒,能处理各种复杂的场景。比如说整个场景只通过门缝透进来的间接光照亮,此时传统的路径追踪方法因为难以采样到透过门缝的这样的特殊路径而产生非常大的噪声。
一张图理解光线追踪 Ray Tracing
典型的光线追踪渲染效果图
光线跟踪的一个最大的缺点就是性能,需要的计算量非常巨大,以至于目前的硬件很难满足实时光线追踪的需求。传统的光栅图形学中的算法,利用了数据的一致性从而在像素之间共享计算,而光线跟踪通常是将每条光线当作独立的光线,每次都要重新计算。但是,这种独立的做法也有一些其它的优点,例如可以使用更多的光线以抗混叠现象,并且在需要的时候可以提高图像质量。尽管它正确地处理了相互反射的现象以及折射等光学效果,但是传统的光线跟踪并不一定是真实效果图像,只有在非常近似或者完全实现渲染方程的时候才能实现真正的真实效果图像。由于渲染方程描述了每个光束的物理效果,所以实现渲染方程可以得到真正的真实效果,但是,考虑到所需要的计算资源,这通常是无法实现的。于是,所有可以实现的渲染模型都必须是渲染方程的近似,而光线跟踪就不一定是最为可行的方法。包括光子映射在内的一些方法,都是依据光线跟踪实现一部分算法,但是可以得到更好的效果。
6.光线投射(Ray Casting)
作为光线追踪算法中的第一步,其理念起源于1968年,由Arthur Appel在一篇名为《 Some techniques for shading machine rendering of solids》的文章中提出。其具体思路是从每一个像素射出一条射线,然后找到最接近的物体挡住射线的路径,而视平面上每个像素的颜色取决于从可见光表面产生的亮度。
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。
环境光遮蔽 Ambient Occlusion
环境光遮蔽(Ambient Occlusion,简称AO)是全局光照明的一种近似替代品,可以产生重要的视觉明暗效果,通过描绘物体之间由于遮挡而产生的阴影, 能够更好地捕捉到场景中的细节,可以解决漏光,阴影漂浮等问题,改善场景中角落、锯齿、裂缝等细小物体阴影不清晰等问题,增强场景的深度和立体感。
可以说,环境光遮蔽在直观上给玩家的主要感觉体现在画面的明暗程度上,未开启环境光遮蔽特效的画面光照稍亮一些;而开启环境光遮蔽特效之后, 局部的细节画面尤其是暗部阴影会更加明显一些。
Ambient Occlusion的细分种类有:
SSAO-Screen space ambient occlusion
SSDO-Screen space directional occlusion
HDAO-High Definition Ambient Occlusion
HBAO+-Horizon Based Ambient Occlusion+
AAO-Alchemy Ambient Occlusion
ABAO-Angle Based Ambient Occlusion
PBAO
VXAO-Voxel Accelerated Ambient Occlusion
一般而言,Ambient Occlusion最常用方法是SSAO,如Unreal Engine 4中的AO,即是用SSAO实现。
光线追踪代码
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
}