陰影映射(Shadow Map)的研究(三),shadowmap
陰影映射(Shadow Map)的研究(三)
最近為了自己製作的項目可是吃了不少苦頭,這其中關鍵的一點就是想要實現陰影映射(Shadow Map)。為了實現目標,我參考了網路上很多相關的資料,也看了一些案例,最終花了我一個月的時間將這個效果實現了。
陰影映射這樣的效果,其實在即將發布的Qt 3D中已經有相關的介紹,KDAB中有一篇文章《Shadow Mappingin Qt3D 2.0》就在Qt 3D的架構上實現了陰影映射。不過當時這個效果是假定目標機器支援OpenGL 3.0規範的,目前大部分裝置,至少是現在,還只能支援OpenGL ES2.0,因此文章無法很好的參考,於是我轉到了其它相關的教程,看看的能不能在OpenGL ES 2.0下實現陰影映射的效果。好在網路上是有這樣寶貴的資料的,在code project網站上,有一篇很好的文章,雖然是基於Android的,使用Java語言編寫,但是能夠很好地顯示陰影映射的效果,最重要的是,由於Android基本上是支援OpenGL ES 2.0的,因此它這個是基於OpenGL ES 2.0來寫的,給我們帶來了很好的參考。原文是:《Shadow Mappingwith Android OpenGL ES 2》。此外,文章引用了其它的連結,其中《Tutorial 16 :Shadow mapping》這篇文章從問題開始入手,研究陰影映射的本質,參考的價值高。
要實現基於OpenGL ES 2.0的陰影映射,要攻克這三個技術痛點:
1、 熟練操作FBO。幀緩衝FBO是需要熟練操控的,因為FBO可以很快地將深度圖寫入一塊顯存中,然後作為紋理渲染到真實的情境中。
2、 掌握著色器的使用。由於OpenGL ES 2.0隻允許使用著色器來對其進行渲染,因此對著色器的書寫熟練程度要求較高。
3、 掌握將float深度資料分拆成vec4再將vec4合并成float的操作。這個已經成為業內熟練掌握的技能之一了,網路上搜尋“how to pack float into RGBA”,能夠得到很多有用的回答。
我在熟讀《Shadow Mappingwith Android OpenGL ES 2》文章以及源碼數遍之後,使用Qt將測試的情境移植了過來。下面是:
源碼:這裡