Light Map是一個比較經典的技術,目前來說應該是一般游戲引擎中的標配,它很好的在一種擬全局光效果的質量和效率上做了中和。不過目前用的更多、質量更好的應該是Directional Light Map,它是原始LM的增強版,通過在預處理與實時還原中考量場景中表面的法向量進而增強效果。DLM的基本操作方法如下:
- 在采樣點處把其半球空間中的輻射照度用某種方法進行采集并保存(比如離線的光線跟蹤);
- 以某種方法存儲額外的、與該輻射照度相關的法線信息到光照貼圖中;
- 實時渲染中通過光照貼圖對像素上的場景輻照度進行還原(結合光照信息與方向信息)。
目前常用的DLM實現方法主要有三種:
Radiosity Normal Maps
該方法最早是在Valve的Source引擎中用的一種模式,它的原理應該是一種擬信號壓縮與重建的方法:
- 在采樣點處選取三個正交的采樣方向作為基方向,采樣得到這些方向上的光照信息并保存(壓縮);
- 實時渲染中通過三個方向及其上的光照值做為基函數,對實際表面法向上的光照值進行還原(重建)。
其中的三個基方向(表面法向所在的局部切空間,如下圖示)分別為:
,
,
對應的還原計算為:
Valve的這種方法應該說還是很不錯的,雖然數學理論依據不太充分,但至少看起來效果很不錯,而且實現簡單,效率較高。不過其也會出現一些問題,那就是當法線的方向與采樣光照的主方向夾角較大(即與采樣切平面的夾角較小時)容易出現一些不太正確的光照還原。
Dominant Directional Irradiance
該方法的原理可以是看作將采樣點半球空間中的輻照信息處理為一個方向光(Directional Irradiance),這樣在實時渲染中就可以使用反射模型進行快速還原;其中的Dominant axis就可以看作是指該平行光的方向。其操作如下:
- 外理采樣點外部輻照信息為:方向光(方向:L,顏色:CL);
- 渲染中直接反射模型模型來還原 。
比如使用Lambert模型時對應的還原計算為:
另外,一般情況下也會使用方向貼圖的空閑的Alpha通道來存儲一個縮放因子,用其來控制該點上外部輻照度的方向性(即被dominant方向影響的力度)。當然,這里也可以使用其它更復雜的一些shading model來操作,不過Lambert已經足夠了。該方法的計算量相對也比較小;存儲空間也比較節省,只需要在傳統LM的基礎上再存儲一張方向貼圖就可以了(目前來說該方法較為流行,比如UE或Enlighten中就使用此方法)。
Spherical Harmonics
該方法與Radiosity Normal Map的方法類似(同樣與Light Probe的原理類似),只不過這里使用了理論與數學依據更為充分的球諧函數來實現外部輻射照度信息的壓縮與重建:
- 把光照函數使用球諧函數進行變換存儲(壓縮);
- 實時渲染中使用時直接利用SH重建進行還原即可(還原)。
這種方法比上述兩種方法都更為高級,一般來說對于任意Normal上的照度信息都能正確還原,而且適應性較強,較為靈活;但同時有很大的缺點那就是存儲空間較大(其LM中每個Pixel中存儲的數據量相當于一個Light Probe對應的存儲的內容),因而其應用范圍就有所限制。
下述是LM與DLM的簡單效果對比,差異還是相當明顯的:
http://blog.csdn.net/bugrunner/article/details/7881819