天天看點

輻射度法線貼圖和延期着色能不能同時使用

 valve的hl2在它的source引擎中開發出了rediosity normal mapping技術,可以認為是hl1的rediosity lightmap的更新版本,提供了現代的用于低成本表現細節的normal mapping的融合。同時著名的引擎開發商epic在它的unreal3中開發和使用了Deferred shading(延期着色)技術,那麼作為現代引擎技術的引領人,這兩種用于技術能夠同時使用嗎,我們在設計引擎時,能夠同時無縫內建兩種光照技術嗎。筆者将對兩者技術的原理展開介紹,介紹其內建的能否性。

        lightmap從根本上來說是一種貼圖技術,它完全可以利用gpu的紋理化固定管線實作,利用多紋理化的技術,把光照貼圖紋理和物體的顔色紋理相乘實作,實際上在通用的固定流水線中視關閉了光照的頂點處理過程,也沒有使用像素光照。從根本上來說,在gpu的流水線中,lightmap沒有進行光照和任何的圖像處理,他的光照運算是通過預計算在流水線之外的cpu過程中處理的,是以可以了解成它是一種提前着色的技術,這種提前而且是在應用程式初始化時,全局計算一次,它是cpu密集的算法,通過疊代使用輻射度算法,進而使用了全局光照模型,高真實模拟自然光照效果,它是一種靜态光照技術。由于走的固定管線沒有改變,是以半透明效果可以正常使用。這是hl1的技術,在source引擎中,後來引入了normal mapping的內建,實際上normal mapping是一種逐像素着色技術,最先應用于phong動态光照模型中,source引擎把這一本來在動态光照中計算的normal map同樣提前到lightmap的計算中,同樣也就融合了normal map表現凸凹細節的優點,同時走的還是不變的流水線,是以可以正确使用alpha半透明,但是同樣是靜态的光照效果。

輻射度法線貼圖和延期着色能不能同時使用

普通的radiosity lightmap:

輻射度法線貼圖和延期着色能不能同時使用

帶normal map 的rediosity最終效果圖:

輻射度法線貼圖和延期着色能不能同時使用

         epic的unreal3的Deferred shading,顧名思義,延期着色,和我們了解的lightmap的提前着色相比,相對于标準的固定流水線的頂點着色或者是可程式設計流水線中的phong着色,他們兩個一個前一個後,都走了兩個極端。更重要的差別在于延期着色是一種動态光照技術,是gpu密集的光照技術,這種動态性,也就是在每一幀都計算光照,也就決定了它使用的是局部的光照模型,這種算法的設計的初衷是為了提高phong模型逐像素動态光照技術的效率,延期着色把光照技術延期到最後的圖像的處理的過程,進而解決了通用的像素着色器中計算多餘的像素(這些像素可能不能通過若幹的流水線測試)的光照情況。這種圖像的處理的辦法,由于設計的本性決定計算光照時,始終隻計算最靠近螢幕的像素的光強值,那些本來在被某個像素遮住的像素,如果不透明時,倒是正常,因為他本來對最終像素顔色沒有貢獻,但是如果是半透明時,這個被遮住的像素,按照固定流水線,本也應該計算光強的,但是由于少了normal map的法線值,進而不能計算光強,使得對最終像素有一定貢獻值的半透明的像素無法正确計算光照,進而不能實作真實的alpha半透明。總之一句話,延期着色不支援alpha半透明。

輻射度法線貼圖和延期着色能不能同時使用

        可以看出延期着色是一種局部光照,每個光源都有自己的衰減半徑,由于接受到光照的像素,并不會向外輻射能量,是以在衰減半徑之外的像素表現很暗,這和source的輻射度表現完全不一樣。

        總結:

        可以看出,radiosity normal mapping 和 Deferred shading雖然一個提前着色,一個延遲,但是其設計的目的不一樣,輻射度算法設計的目的是為了高真實的模拟現實光照,延期着色目的是大幅度提高局部光照的效率。同時基于lightmap的輻射度的算法是靜态的光照技術,而延期着色是動态的光照技術。由于場景的光照效果,隻需要一次光照,這也決定了我們隻能使用其中的一種光照方案。其實兩者應該從效率來說都是較高的,輻射度是預計算,是以實時的時候不會重新計算。而延期着色,減少了無關的光照計算。不過一個是靜态,一個是動态,一個是全局,一個是局部,這個也就是你選擇方案的考慮的事情了。