2014年2月4日 星期二

Computer Graphic --- Shadow

      在電腦圖學領域內 , 陰影 ( Shadow ) 的研究也是很重要的一門領域 , 場景中若缺乏陰影 ,會顯得不真實.而看起來是這麼平凡, 隨處可見且理所當然的 shadow , 而在早期的遊戲動畫產業,想要能即時的 (real time) 計算它並呈現完美的陰影效果, 是很困難的. 甚至現在很多的3D遊戲還是繼續用假的陰影來欺騙我們的眼睛 ( 人類的眼睛是很容易被欺騙的^^), 貼一張看似物體形狀的 (大多是圓形)的陰影在腳色的腳底下跟著腳色移動 , 看似太陽從正上方照下來的陰影形狀 圖一

 (圖一)

何謂假的陰影:  沒有正確的得知場景中物體彼此之間的遮蔽關係跟它們的可見度( visibility )

何謂真的陰影:  透過任何演算法, 正確地得知場景中物體彼此之間的遮蔽關係 , 並計算出它
                             們的可見度 ( visibility)   (圖二)
 (圖二)

要正確計算每個物體的 visibility , 最直覺且正確的算法就是:

(1). 從這個物體中心往四面八方射出無限多條追蹤線 ( tracing line ) , 積分出它的可見度 (圖三)

 (圖三)

但上述方法(1) , 還不太能用在很需要即時運算反應的遊戲產業上 (但我相信未來的 GPU繪圖
硬體設備越來越厲害時,有機會達到逼真且即時計算的陰影效果),取而代之的有兩種方法
(2) Shadow Mapping  (3) Shadow Volume , 這邊先大改講一下兩種方法的優缺點 ,下一篇會講他們的理論作法 , 與 coding 方式.
這兩種方法都可以大略的得知物體的遮蔽資訊 , 


Shadow Mapping :

目前遊戲業我相信應該還是以 Shadow Mapping 為主流 , 因為它實作簡單 ,且因為先天的演算法
條件在靜態場景上能發揮最大效能 , 不過會產生出來的陰影, 在先天演算法的設計下, 有很大的機會產生鋸齒狀的陰影外框 (圖 四 ) ,但經過許多的專家學者們的努力, 它已經被改良的非常好很多缺點都可以被克服, 所以在動態的場景上的效果表現已很不錯了 (註一) ,

(圖四)


Shadow Volume : 

此方法非主流 ,  因為它先天的演算法設計本身就不是很match 現行的電腦圖學發展情況 , 在場景中物體非常多 , 物體的 polygon 數量非常多 的情況下 ,
會導致繪製陰影的時間很久 , 如果又是動態場景 , 只能說悲劇的效能 , 更別提如果要做 soft shadow (註二),  就親自實做過的經驗 , 不建議再用 shadow volume 來實作陰影 ( 目前的學術與業界主流都是以 shadow mapping 為主 , 由這點可以看出端倪 , 別往死胡同裡去^^)


註一 :

   動態場景( Dynamic Scene) 指的是場景中物體可移動的情況 , 在學術界中 , 對動態場景的區別
   有分 : 1. 鏡頭移動   2. 物體移動   3. 光源移動   4. 全部都可以移動 
   移動的表現是:  1. 單純的平移(上下左右)  2. 旋轉   3. 型變 (形狀改變 ) 
   最好的情況當然是 , 演算法能適用在 上述任何情況!!

註二:

    真實的場景中 , 幾乎是看不到 hard shadow 的 , 如果只用 shadow mapping 或 shadow 
volume 計算 visibility , 被遮到給0 , 沒被遮到給 1 ,  boolean 的方式裝載 遮蔽資訊 , 只會有 hard shadow 的效果而已 , 之後會講解如何用 shadow mapping 做出 假的 soft shadow.
     
 ( Soft  Shadow)
 ( Hard Shadow)