陰影映射(Shadow Map)的研究(一),shadowmap
陰影映射(Shadow Map)的研究(一)
這段時間在搭好自己的架構後,就開始馬不停蹄地研究陰影映射的內容了,說起陰影映射,倒不如說shadow map更容易被專業人士所接受。shadow map是我進階圖形學的第一課,以後的圖形學內容,會變得非常複雜,每寫一個例子,都要牽涉到非常多的演算法以及代碼。但是我不得不這麼做,因為只有這樣才能成為電腦圖形學的高手。
蔣彩陽原創文章,首發地址:http://blog.csdn.net/gamesdev/article/details/44628427。歡迎同行前來探討。
shadow map簡單地說,就是讓通過電腦圖形的類比,在3D情境中產生陰影的效果。這個演算法可以說很久之前就已經存在了,而隨著硬體效能的提升,我們可以從幀緩衝中提取陰影,然後在讓其作用在我們想要產生陰影的表面上,非常簡單。本例呢,就是將FBO與shadowmap結合起來,渲染一個帶有陰影的情境。
要產生含有shadow map的情境,我們要進行至少兩遍的渲染。要知道,陰影的形成是要有光源的。但是除了ADS(Ambient、Diffuse、Specular)渲染之外,我們只用到光源的位置以及視向(lookAt)。但是這是一個很重要的資訊:我們正在建立陰影!
下面是我將FBO與shadow map結合的一些實踐。
1、 FBO綁定,開始渲染到FBO;
2、 視點轉移到光源位置,利用position以及lookAt產生viewMatrix;
3、 將著色器中渲染light space shadow map的深度圖(有關深度圖產生的shader,參照這裡);
4、 FBO解除綁定,開始渲染到default render target;
5、 視點轉移到攝像機,準備普通的渲染;
6、 在著色器中普通地渲染情境,同時,在需要添加陰影映射的地方使用我們的深度圖作為紋理貼上去即可。
需要說明的是,這隻是一個不完全的示範效果,因為只是生硬地將深度FBO紋理貼在了下面的平面上,所以深度的顏色效果還是看得出來的,並且這個程式沒有做ADS光照效果,更沒有做遮擋的深度比較,所以接下來需要將這個例子深入,以後添加上物件多重材質透明混色,這樣效果會更好一些。最後是這個程式在Android以及Windows Phone上面的運行情況。