Ogre陰影實現原理解析

作者本人對Ogre研究也不是很深,本文僅供初學者參考
這裏介紹兩種陰影實現原理,陰影錐陰影和紋理陰影

一、陰影錐陰影

顧名思義,陰影錐陰影其實就是創建一個椎體。

我們以光源位置爲起點,和需要產生陰影的物體的外圍輪廓(光源作爲參考位置)連線然後無限延伸,這樣就得到了一個椎體,利用這個椎體做模板測試。

我們把面對攝像機爲正面的椎體面先繪製一遍,在相應的模板位置+1

我們把背對攝像機爲反面的椎體面再繪製一遍,在相應的模板位置-1

最終模板測試的時候,模板數值>=1的就爲陰影點,否則則不是

因爲陰影錐無限延伸也不會造成變形,所以陰影錐產生的陰影是不會有鋸齒邊的,但是因爲計算陰影錐失效率降低了很多,故大場景實時陰影用此方法不可取


二、紋理陰影

紋理陰影相對來說就會複雜一點了,但是好處也很多,後面再詳細敘述
第一步,我們先創建一張RTT紋理,用於渲染陰影。在光源點創建一個攝像機(計算出視圖投影矩陣爲M1),將需要產生陰影的物體渲染一遍,注意此時渲染到上一步創建的紋理上面,並且只需要渲染深度值到紋理就行了(記錄紋理爲T1),這樣第一步就完成了
第二步,我們利用Shader編程在頂點程序裏面,將M1、T1傳入到GPU裏面,當渲染一個頂點P的時候,我們先計算出頂點的世界座標PW,利用PW和M1計算出在M1矩陣下投影出的位置PM1,取X,Y爲紋理座標,取出TI裏面的深度值,與PM1深度值作比較,若比PM1大,則說明是陰影,進行下一步的陰影混合
第三步,在片段程序裏面進行陰影混合即可


其實想想,CF裏面的噴塗,其實實現方式應該和上述紋理陰影很類似。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章