全局光照(简述)
一、什么是全局光照
全局光照(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 Illumination
- Deferred Radiance Transfer Global Illumination
- Deep 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、蒙特卡洛光線追蹤 計算機圖形學冬季作業
總結
- 上一篇: matlab编写LDA,lda算法mat
- 下一篇: LDA算法原理及LDA与PCA的比较