概述
陰影對於真實感場景繪製具有重要的意義,不僅能夠反映空間中物體之間的相互遮擋關係,也能反映遮擋物以及接收表面的幾何信息,陰影的實時繪製還大大增加了場景繪製的真實度,目前陰影繪製技術主要有陰影圖算法和陰影體算法兩類,與陰影體算法相比,陰影圖算法具有與場景複雜度無關、易於實現以及受圖形硬體支持等優點,它在業界得到了更廣泛的套用。
陰影圖描繪過程
傳統陰影圖算法可以分為2個基本繪製過程:
1、將光源作為視點,對整個場景進行繪製。此時,僅在Z快取中保存從光源到場景的最小深度值,從而得到一張陰影圖,陰影圖中的每個單元稱為一個陰影紋素。在靜態場景的情況下,這一步可以作為預計算部分;而在動態場景中,一旦場景中的遮擋關係發生改變,就需要實時地更新陰影圖。
2、回到以相機為視點的視圖中,按照傳統的渲染流水線方式對場景進行繪製。不同的是,在繪製過程中要進行陰影判斷,即判斷某個像素是否處於場景的陰影中。若像素不在陰影中,則正常繪製;否則繪製成陰影。判斷場景中某個點是否在陰影中需要用到第一次繪製的陰影圖:對於場景中的某個點P,首先將其轉換到以光源為視點的3D空間,得到P點在該空間下的深度值;然後與陰影圖中P點對應的紋素所保存的深度值作比較,若P點深度值大於陰影圖中保存的深度值,則說明P點被遮擋,處於陰影區域,否則說明不在陰影區域。通過這種簡單的判斷,就可以得到場景中的陰影區域。
優勢
1、原理簡單,實現方便。陰影圖算法的基本原理比較簡單,其涉及2個基本的繪製過程:陰影圖生成和場景繪製。陰影圖可以使用2D紋理貼圖實現;場景繪製過程增加一個深度比較功能,其實現也很方便,3D圖形庫(如OpenGL)一般自動實現深度比較功能。
2、獨立於場景複雜度。陰影圖是一種基於圖像的陰影生成方法,對場景空間的複雜度依賴性很低,它的複雜度僅取決於光源數和陰影圖解析度。這一點是區別於基於物體的方法的,在陰影體方法中,需要對場景中的物體進行分析,並根據物體幾何特徵得到其陰影體,所以場景越複雜,需要分析的物體就越多,該方法效率越低.相反,陰影圖方法無需分析場景,無論對什麼場景,在光源一定的情況下,只要陰影圖的解析度確定,其複雜度就確定。
3、適合GPU硬體實現。GPU是一種專門用於圖形處理的硬體,其相對於CPU具有強大的浮點數運算能力和並行處理能力,所以對於處理大數據量的運算(特別是圖形圖像相關的任務)而言,它具有獨特的優勢。目前的GPU都提供了高度的可程式性,所以一般的陰影圖算法都可以移植到GPU上,以提高整體渲染速率。
缺點
1、走樣問題。該問題是陰影圖算法的最主要問題,原因是在深度比較過程中涉及到對陰影圖的採樣。如果陰影圖的解析度低於採樣需求,就會產生走樣,其典型的表現為鋸齒狀陰影邊界。還有一種稱為自陰影走樣,是受各類數值精度的影響,包括快取本身精度的限制和各種轉換的數值精度影響而產生的;光源採樣和螢幕採樣的偏差也會產生這種問題,其表現為陰影中一些斑駁的色塊,即光滲現象。通過提高Z快取位數或者引入偏移因子可以改善陰影效果,但是偏移因子的確定很困難。
2、處理全向光或半球形光問題。全向光就是向整個空間發射光線的光源(如白熾燈),半球形光是向半個空間發射光線的光源。由於該類光源的視域非常大,所以處理起來比較麻煩,一般一個簡單的陰影圖無法保存所有的深度值,所以必須使用其他的技術來解決。