2011年6月23日 星期四

手機上的進階Shading與Lighting表現


家好! 你可能已經聽過由MADFINGER Games所開發的Shadowgun這款新的手機遊戲, 你可能也看過這款遊戲在WWDC展覽的Graphics State of the Union單元的實機展示了吧!


我們很驕傲地說, 這款用Unity開發的新遊戲, 在手機遊戲上面也能夠有如同遊戲機般的品質. 在iPad2上面可以有相當好的FPS=60 , 而iPad iPhone4 &3GS也有FPS=30. 這款遊戲也會在Android系統上發佈. 因為照明是一款遊戲好看的主要因素, 這篇我們來談談這款遊戲所有到的相關技術.

角色shading
所有的遊戲角色都用相同的per pixel normal mapped isotropic BRDF pixel shader, 這比一般的Phong shading還要先進, 用在角色皮膚, 金屬與布料上面有很好表現. 我們的方案結合了預先計算的材質, 描述物件表面如何與光照互動, 還有run-time的per-pixel計算. 這項技術同時有美感的控制與絕佳效能的優點.

Light probes
Light probes是一種先進的動態物件與角色光源的先進技術, 用來產生高品質的烘焙照明. 這個技術可以捕捉直接光照與場景中的反彈光. 場景中可以有好幾的捕捉點---這些稱為light probes. 當角色在場景中走動, 最接近的probes會被選中, 跟周圍的probe進行內差計算, 然後把計算結果傳遞到角色的shader, 進行很有效的光照計算. 這項技術可以進行per-vertex 或 per-pixel的採樣. 如果你想要進行normalmap-perturbed normal也可以.

很快速地選擇適當的probes並計算內差是一項困難的工作, 但是我們克服困難開發了這項技術, 能夠選取好幾組的probes進行Delaunay tetrahedralization計算, 把關卡空間切割成好幾的四面體.

這樣就可以用來產生快速的內差, 而且不會有突兀的光線突然亮暗的問題. 當角色在特定的四面體範圍內, 四角的probe的權重就是角色的重心. 找尋最後一個frame也是找到正確的四面體的有效方式, 如果沒有猜對(大部分的狀況都是這樣). 我們會找尋附近看看有沒有更好解, 最後我們確認在probe的外面的內差計算是否正確 ,不管是速度的計算或是正確性, 這是由很聰明的投射到hull surface的技術來進行計算的.

我個人對light probes這項技術的開發很引以為傲, 因為我們把這項技術開發到超級快, 而且具有很低的記憶體足跡(memory footprint). 即便是在手機上也能有實實在在的效能表現, 據我所知, 這項技術是最早被應用在手機上面的.

槍口閃光(Muzzle flashes)
順帶產生的特效, 因為我們能夠透過light probe對角色來進行渲染, 因此可以投射多餘光源到probe上面. 因此, 我們把這項功能應用到槍口閃光特效上面(muzzle flash), 這種效果只會消耗很少的CPU計算, 且不會影響到GP,U 就能夠得到動態光源.

耶穌光, 耀光與霧氣
耶穌光, 耀光與霧氣可以用靜態與動態的alpha-blended geometry算圖, 透過最佳化的vertex 與 pixel shaders, 可以減低fillrate.

Lightmaps
在Unity裡面只需要單鍵用Beast就可以進行Lightmaps的烘焙動作. Beast能夠捕捉到在靜態物件上美麗的GI效果. 為了要讓物件有更多細節, 但還讓shader有效率地計算, 我們計算了每個vertex的approximate specular reflections, 接著用gloss mask進行per pixel的控制. 這樣可以把反射模糊與亮面模糊的材質分別出來, 反射物件還還以用預先烘焙的cube map捕捉周遭環境的效果.

焦散與角色陰影
水的焦散與角色陰影或是風扇的陰影可以用投影動態的材質模擬出來.


我們預計會在Unity 3.5釋出light probes的功能, 其他功能則是目前就做的到了.

沒有留言: