源自《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
}