歷史與發展
AO是來描繪物體和物體相交或靠近的時候遮擋周圍漫反射光線的效果,可以解決或改善漏光、飄和陰影不實等問題,解決或改善場景中縫隙、褶皺與牆角、角線以及細小物體等的表現不清晰問題,綜合改善細節尤其是暗部陰影,增強空間的層次感、真實感,同時加強和改善畫面明暗對比,增強畫面的藝術性。
AO這項技術最早是在Siggraph 2002年會上由ILM(工業光魔)的技術主管Hayden Landis所展示,當時就被叫做Ambient Occlusion。象RenderMan系列渲染器中的PRMan、BMat以及Maya、Blender等軟體引入AO技術較早,Softimage|XSI與Cinema 4D是在Siggraph 2005上發布的版本中增加AO的。
在Max的渲染器中,除Mr較早外,最近的fR Stage-1 R2.0和VR 1.5RC3才見AO現身。對此,打個玩笑的比方:如果對Max中四大渲染器的AO來劃“階級成分”的話,mr算是“地主”了,它的AO Shader資歷最深、家產最多,除本能外還可以放入相機、燈光Shader來計算和控制,高級用戶更可自行編程,另外新增的“建築與設計材質”也內置了“AO特效”;fR可算“富農”,因為AO Shader同樣擁有用作燈光、遮罩、融合以及反射的“資本”,但終因無QMC之故AO雖快卻質差,所以是“暴發戶”一類的;VR差不多算“中農”吧,雖然就一個“Dirt”倒也能自給自足,不花哨從而保持了“本色”;而Br就是貧農了,因為它目前尚不擁有AO(但它基於QMC的GI似乎可以抗衡其他渲染器GI+AO效果,而且據說最新的2.0版本在整體速度上已經超過了VR 1.5RC3)。
最終目的
隨著計算機圖形技術的發展,玩家對遊戲畫面圖形的逼真度要求越來越高,而近些年推動遊戲圖形畫面逼真的最關鍵環節就是光照/光影效果,如果能非常近似的模擬與現實生活一樣的光照效果,那么遊戲的畫面將非比尋常,但是光照/光影效果的計算非常複雜而且消耗巨大的資源,成為阻礙相關技術推進的最大障礙。
實現光照/光影的最逼真效果就是達成全局光照。在早期的遊戲中僅能實現直接光照的效果,也就是說光線從光源發出、照射到物體上後、反射到玩家眼中,光照的計算就完成了。
全局光照在靜態圖形的處理上比較完美,因為靜態圖形可以等待渲染的時間
但是在現實中,要得到高度真實感的圖形畫面,不僅要計算直接光照,還需要計算間接光照,也就是說,光線從光源發出、照射到物體上後,除了計算物體本身反射到玩家眼中的光線,還要計算物體多次反射、折射、吸收光線,以及物體之間因為反射、折射而導致的光線、陰影變化,經過綜合計算將光線和陰影的最終效果展示(反射)到玩家眼中,從而實現全局光照的效果。
全局光照在靜態圖形的處理上比較完美,因為靜態圖形可以等待渲染的時間,但是對於遊戲來說,持續的動態畫面必須保證每秒幾十fps的渲染速度,因此全局光照的處理就需要非常謹慎,其算法在推進畫面真實度的同時,必須保證相應的效率,否則就會打破畫面效果和幀速度之間的平衡。
說到這裡,我們先介紹一下實現全局光照效果非常好的一種方式,那就是“光線追蹤”技術(Ray Tracing),光線追蹤算法分為兩種:正向追蹤算法和反向追蹤算法。其中,正向追蹤算法是大自然的光線追蹤方式,即由光源發出的光經環境景物間的多次反射、透射後投射到景物表面,最終進入人眼。反向追蹤算法正好相反,它是從觀察者的角度出發,只追蹤那些觀察者所能看見的表面投射光。
光線追蹤技術實現了最佳的全局光照效果,但是與目前的顯示卡架構融合困難
Intel、AMD和NVIDIA都在光線追蹤技術方面有所發展,Intel根據相應技術對《Quake4》遊戲進行了重製,但是相應的GPGPU處理器Larrabee的銷聲匿跡讓這個技術也暫時消失在人們的視野中;ATI在HD4000系列時代曾經展示過基於光線追蹤技術的Cinema 2.0,但目前仍然沒有技術的更新資料;NVIDIA在光線追蹤方面相對領先,其發布了基於CUDA架構的光線追蹤引擎OptiX。
光線追蹤在未來將會是實現全局光照的最佳方案,但是光線追蹤的計算方法非常複雜、負載極大,並且與目前顯示卡架構以光柵化為主的處理方式難以融合(Intel和NVIDIA目前都趨向於在Larrabee、Quadro等上實現),短期內仍然無法套用於遊戲顯示卡上。
現在將話題轉回來並做一個簡短的總結:
1.全局光照是未來實現遊戲圖形畫面真實化的一個重要元素(其可以達成光影效果的逼真化,對應的相反關鍵字為直接光照)。
2.光線追蹤是實現全局光照完美效果的最佳技術/方式之一,也是未來的一個發展方向,其技術實現方式最接近現實的物理模型,但是因為效率較低,所以目前的遊戲和顯示卡架構無法承擔。
3.目前遊戲已經開始實現全局光照的效果,但是並未採用光線追蹤的方式,而是採用其它多種實現方式來達成全局光照的效果,其中包括“AO”環境光遮蔽。
4.“AO”環境光遮蔽是實現全局光照中部分物體局部光照和陰影真實化的一種技術方式,其函式實現方式並未嚴格遵循現實的物理模型,但是效率較高,因此被當前遊戲廣泛套用。
5.再次強調,AO環境光遮蔽(包括其變種SSAO、HBAO等)僅是實現全局光照的技術方式之一,當前的遊戲套用了多種技術方式共同達成全局光照總體效果的完善和完美。
技術原理作用
經過前面的介紹,我們已經了解了環境光遮蔽存在的目的,下面我們簡單介紹一下AO環境光遮蔽的實現機理。AO環境光遮蔽通過相對廉價的計算效能來實現全局光照中陰影的高級效果,簡單說AO環境光遮蔽就是在每個取樣點上計算它被其它幾何體覆蓋的程度,是計算在一個統一的光強度下場景的軟陰影效果的圖形技術。
AO環境光遮蔽在多種靜態3D處理軟體(如3D Max或Maya)中都有涉及,其是一種比全局光照效率更高的光照處理方式(效果接近),它通過改善陰影來現實更好的視覺效果,提高場景的深度和層次感,大大豐富了圖像細節。
下圖:一般光照渲染模式
下圖:AO光照渲染模式
AO環境光遮蔽是實現全局場景類似軟陰影從而達成更佳全局光照效果的技術
在3D軟體中套用的靜態AO環境光遮蔽因為需要預渲染、而且速度仍然較慢,所以不能直接照搬到動態畫面(遊戲)的處理方式中。在近些年的遊戲中,很多遊戲公司都致力於表現更逼真的光照效果,提出了很多相關的技術,比如《半條命2》中的Radiosity Normal Maps技術、《潛行者》中的GI全局光照等等。
這些技術都未能很好的實現光照的效果或效率的保證,此時Crytek正在開發《孤島危機》,其套用了一項名為Real-Time Ambient Map(實時環境光照貼圖)的技術,這項技術非常接近SSAO技術,而隨著研發的深入,這項技術最終被升級為新的算法,並在CryEngine2引擎的技術白皮書中最終將這項升級後的技術命名為SSAO。
從這個角度講,其實在電腦遊戲的套用中,率先提出的環境光遮蔽在算法上已經直接達成了SSAO(螢幕空間環境光遮蔽),而AO環境光遮蔽這種模式並未直接在遊戲中套用,至於NVIDIA在控制臺中的提出的“AO環境光遮蔽”的概念,我們對其算法不得而知,但是可以明確的是,其算法必然與靜態的環境光遮蔽的算法不同,可能就是SSAO(螢幕空間環境光遮蔽)或者類似的算法。
看一段小文字:
《鯊魚故事》(Shark Tale)是2005年第77屆奧斯卡金像獎“最佳動畫長片”提名的三部影片之一。為了更好地達到“繪畫感”這個需要,總美工設計師皮埃爾特別用到了軟區域陰影和反射光,即利用環境光來模擬柔和陰影,這是當時非常流行的一種新的燈光技術,稱為“Ambient Occlusion”(夢工廠稱之為“exposure”<曝光>),它能夠為表面上的每一點精確計算來自天空的自然光量,這樣處理的結果就像是一張陰天狀態下曝光極好的灰度照片。然後將Ambient Occlusion Pass(AO層)與環境燈光合成,這樣,CG元素與實拍的素材就非常自然地結合在一起了。
3D軟體(渲染器)中AO的原理是統一的,Max中mr、fR、VR的AO也是幾乎一致的(只是可控性和功能、用途有所不同)。順便提一下,如果有些使用VR的朋友確實認為mr或fR的AO既快又功能多的話,那么不妨結合了使用,就是說“VR原始渲染+mr或fR的AO”進行合成,這其實也是我最近想到的一個思路。但就目前而言,我還是很喜歡VR的AO,因為它操作簡單靈活、效果真實細膩。
What is occlusion ?
To simplify the explanation, just think of a situation when all your objects have a simple white color and your scene is lit equally from all directions by a white light. Basically this should result in a blank white image, but what happens when some objects block a certain amount of rays that should have gotten to other objects ? those rays don't reach the other object and as a result, the parts where the rays were blocked will become darker. The more rays blocked, the darker the surface will be. So basically what we get is a white image with dark areas where geometry intersects with itself.
什麼是Occlusion?
簡單的來解釋,那就想像一下這樣的一個情形:當場景中所有的物體都是單一白色並且是由一個白色燈光來產生均勻的直接照明,那么基本上,結果就是得到一個蒼白的圖像。但是當某些物體阻擋了相當數量的本應投射到其他物體的光線時,那將會發生什麼呢?這些光線沒有到達那些物體,結果就是被光線阻擋的地方變得較暗。越多光線被阻擋,表面就越暗。所以基本上我們得到的是一個帶有自身幾何相交暗區的白色圖像。
Why using it ?
The resulting occlusion pass gives very accurate and smooth shadows that resemble the result of global illumination. Compositing these shadows over your final render can significantly improve your image in many ways, it can mainly improve your shadows, give more depth to your scene and really helps to better show all the details of your models.
為什麼使用它?
Occlusion pass的結果就是貢獻了非常精確和平滑的陰影,就好像是全局照明的結果。在你最終渲染後有多種方法來合成這些陰影會在真正意義上改善圖像,它主要能改善陰影,給場景更多的深度,真正有助於更好的表現出模型的所有細節。
AO採用快速而廉價的算法來模擬全局照明模式。其大致計算過程是在幾何體表面任意一點的上方,用半徑預定的半球探測該點的外部區域,從而決定光線是否在該幾何體表面上該點處被其他幾何體阻擋,或者,被吸收。一旦各點的吸收幅度確定,則幾何體表面會形成一張灰度級的映射圖,用以調製環境光對該幾何體表面的貢獻,映射圖中明暗區域均按比例調節其對環境光吸收的強弱程度。
技術總結
AO不需要任何燈光照明,它以獨特的計算方式吸收“環境光”(同時吸收未被阻擋的“光線”和被阻擋光線所產生的“陰影”),從而模擬全局照明的結果(enhance GI or fake GI),它主要是通過改善陰影來顯示更好的圖像細節,尤其在場景中物體很多從而到處阻擋著光線導致間接照明不足時,AO的作用會更加明顯。