GPU Gems1 - 17 环境遮挡
環(huán)境光遮蔽(Ambient Occlusion)“AO”為Amblent Occlusion的縮寫,中文譯為環(huán)境光遮蔽。在DirectX 10.1 API推出后,Amblent Occlusion升級為SSAO(Screen-Space Ambient Occlusion:屏幕空間環(huán)境光遮蔽);而在微軟推出DirectX 11 API后,SSAO升級至HDAO(高解析度環(huán)境光遮蔽:High Definition Ambient Occlusion)。
我們有必要對AO(環(huán)境光遮蔽)的釋義進行一個簡單了解:AO是來描繪物體和物體相交或靠近的時候遮擋周圍漫反射光線的效果,可以解決或改善漏光、飄和陰影不實等問題,解決或改善場景中縫隙、褶皺與墻角、角線以及細小物體等的表現(xiàn)不清晰問題,綜合改善細節(jié)尤其是暗部陰影,增強空間的層次感、真實感,同時加強和改善畫面明暗對比,增強畫面的藝術(shù)性。可以說:
AO特效在直觀上給我們玩家的感受主要體現(xiàn)在畫面的明暗度上,未開啟AO特效的畫面光照稍亮一些;而開啟AO特效之后,局部的細節(jié)畫面尤其是暗部陰影會更加明顯一些。
本章講到了如何使用有效的實時環(huán)境光遮蔽技術(shù),對物體遮蔽信息及環(huán)境進行預處理,綜合這些因素給物體創(chuàng)建逼真的光照和陰影。本文大部分參考https://zhuanlan.zhihu.com/game-programming
1 概述
首先,本文中講到,環(huán)境光遮蔽(Ambient Occlusion)一般而言有兩種理解:
1)將環(huán)境光遮蔽視為“智能”的環(huán)境光項,其在模型表面的變化取決于在每點可見多少外部環(huán)境。
2)將環(huán)境光遮蔽視為一個漫反射項,其能有效地支持復雜分布的入射光線。
文中將考慮上述的第二種解釋。
其基本思路是,假如預處理一個模型,計算它上面每個點可以看到多少外部環(huán)境,可以相反地計算有多少環(huán)境被模型的其他部分遮擋,然后在渲染時使用這個信息計算漫反射著色項的值。其結(jié)果是模型上的裂縫變暗,而模型的暴露部分會接收更多的光線,因此更明亮。這種效果實質(zhì)上比使用標準的著色模型更逼真。
另外,這個方法可以擴展為使用環(huán)境光作為照明源,用代表各個方向入射光的環(huán)境貼圖沒來決定物體上每個點光的顏色。為了這個特性,除了記錄在點上可以看到多少外部環(huán)境之外,也記錄大部分可以光從哪個方向到達。這兩個量有效地定義了從外面進入場景的未被遮擋的方向圓錐體,可以一起用來做為來自環(huán)境貼圖的極端模糊的查詢,模擬著色點上來自感興趣的方向圓錐體的全部入射照度。
2 預處理步驟(The Preprocessing Step)
給定一個任意的著色模型,環(huán)境光遮蔽算法需要知道模型上每點的兩個信息:
(1)該點的“可到達度(accessibility)”- 即該點上方半球的哪一部分未被模型的其他部分遮擋;
(2)未被遮擋的入射光的平均方向。
通過下圖在平面上說明這兩個概念。給定在表面上的點P,其法線為N,P點上半球的2/3被場景中其他幾何體遮擋,半球另外的1/3不被遮擋。入射光的平均方向用B表示,其在法線N的右側(cè)。大致來說,在P點的入射光的平均顏色,可以通過求圍繞B矢量的未遮擋入射光的圓錐體的平均值得到。
下面貼出的偽代碼顯示了我們的基本方法。在每個三角形的中心,我們產(chǎn)生一組以表面法線為中心的半球形光線,跟蹤每道光線進入場景,記錄哪些光線與模型相交,標志不能從環(huán)境接收的光線,以及不被遮擋的光線。接著我們計算不被遮擋的光線的平均方向,這給出了入射光平均方向的近似值。(當然,我們計算的方向?qū)嶋H上可能會被遮擋,但我們選擇忽略不計這個問題。)
Example 17-1 計算環(huán)境光遮蔽量的基本算法偽代碼 (Basic Algorithm for Computing Ambient Occlusion Quantities)
For each triangle {Compute center of triangleGenerate set of rays over the hemisphere thereVector avgUnoccluded = Vector(0, 0, 0);int numUnoccluded = 0;For each ray {If (ray doesn't intersect anything) {avgUnoccluded += ray.direction;++numUnoccluded;}}avgUnoccluded = normalize(avgUnoccluded);accessibility = numUnoccluded / numRays;}生成這些光線的簡單方法是使用拒絕采樣法(rejection sampling):檢測在x,y和z為-1到1區(qū)間的3D立方體中隨機生成的光線,并拒絕不在單位半球中與法線相關(guān)的光線。
能通過這次檢測的光線方向可視分布理想的光線方向。列表17-2的偽代碼表示出了此方法的實現(xiàn)思路。
當然,也可以用更復雜的蒙特卡洛(Monte Carlo)采樣法來得到更好的樣本方向的分布。
Example 17-2 使用拒絕采樣法計算隨機方向的算法偽代碼(Algorithm for Computing
Random Directions with Rejection Sampling)
另外,用圖形硬件代替光線追蹤軟件,有可能加速遮擋信息的計算。
3 使用環(huán)境光遮蔽貼圖進行渲染(Rendering with Ambient Occlusion Maps)
使用環(huán)境光遮蔽貼圖進行著色的基本思想是:可以直接在著色點處使用之前已計算好的,有多少光線能到達表面的,優(yōu)質(zhì)的近似值信息。
影響這個數(shù)值的兩個因素是:
(1)在此點上方半球的哪個部分不被點和環(huán)境貼圖之間的幾何體遮擋。
(2)沿著這些方向的入射光是什么。
下圖顯示了兩種不同的情況。在左圖中,只能看到著色點上面的一小部分,由方向矢量B和圍繞它的方向圓錐體所表示,該點的可到達度非常低。而在右圖中,沿著更大范圍的方向有更多的光線到達給定點。
圖 不同量的可見度的近似(左圖:由于附近的幾何體的遮擋比較嚴重,這點得到的照度較小;右圖:沿著更寬方向的圓錐體,更大量的光能到達這點,照度較左圖更大)在預處理中計算的可訪問性值告訴我們哪一部分半球可以看到環(huán)境貼圖,而可見方向的平均值給出一個近似方向,圍繞它計算入射光。雖然這個方向可能指向一個實際被遮擋的方向(例如,如果半球的兩個獨立區(qū)域未被遮擋,但其余的部分被遮擋,平均方向可能在這兩者之間),但在實踐中其通常運行良好。
有無使用環(huán)境光遮蔽貼圖進行渲染的對比圖?
【核心要點總結(jié)】
?
給定一個任意的著色模型,環(huán)境光遮蔽算法需要知道模型上每點的兩個信息:
1)該點的可到達度(accessibility)。
2)未被遮擋的入射光的平均方向。
文中提出的環(huán)境光遮蔽方法,總結(jié)起來有三個要點:
- 采用了多種在實踐中運行良好的近似方法。
- 主要為預處理操作,將相對昂貴的計算事先準備好,且僅計算在渲染時進行快速著色所需的正確信息。
- 預處理不依賴于光照環(huán)境貼圖,因此可以輕松使用場景中的動態(tài)照明。
【本章配套源代碼匯總表】
Example 17-1 計算環(huán)境光遮蔽量的基本算法偽代碼(Basic Algorithm for Computing
Ambient Occlusion Quantities)
Example 17-2 使用拒絕采樣法計算隨機方向的算法偽代碼(Algorithm for Computing
Random Directions with Rejection Sampling)
Example 17-3 使用可到達度和環(huán)境映射進行著色的片元Shader(Fragment Shader for
Shading with Accessibility Values and an Environment Map)
Example 17-4 latlong( )函數(shù)的定義(The latlong() Function Definition)
Example 17-5 computeBlur( )函數(shù)的定義(The computeBlur() Function Definition)
【關(guān)鍵詞提煉】
環(huán)境光遮蔽(Ambient Occlusion)
拒絕采樣(Rejection Sampling)
環(huán)境光遮蔽貼圖(Ambient Occlusion Maps)
?
總結(jié)
以上是生活随笔為你收集整理的GPU Gems1 - 17 环境遮挡的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Jitsi 开源视频会议远程桌面共享&a
- 下一篇: Integrative Genomics