GPU Gems1 - 12 全方位的阴影映射
在這章中,把陰影貼圖的思路擴展到正確處理全方位的(點)光源中,其中包括了實現細節,也涉及到基本硬件能力不足時的低效運行策略。
首先,這篇文章也談到了在實時計算機圖形學中產生可見陰影的兩個流行方法是:
- 模板陰影(stencil shadows)/ 陰影體(Shadow Volume)? ?相關知識可以參考之前的章?https://mp.csdn.net/postedit/89161545
- 陰影貼圖(shadow mapping)相關知識可以參考之前的文章?https://mp.csdn.net/postedit/89207385
模板陰影(Stencil Shadows,也被稱Shadow Volume,陰影體)作在《Doom 3》中有所應用,優點是得到大量的GPU支持、獨立于光源的種類、產生的陰影質量很高。但缺點是嚴重依賴于CPU,只能產生清晰的影子,需要很高的填充率,而且不能與硬件(hardware-tessellated)的表面一起使用。
陰影貼圖(Shadow Mapping,也譯作陰影映射)由Lance Williams于1978年引入計算機圖形學,文章發布當時多數好萊塢電影都在使用這個方法,包括計算機渲染和特效。為了計算陰影,陰影映射在場景幾何體上投射特殊的動態創建的紋理。它可以渲染清晰和模糊的影子,以及由不同類型的光源產生的陰影,它還可以與硬件鑲嵌的表面以及GPU動畫的網格(例如蒙皮網格)一起使用。
該文章主要介紹了全方位陰影貼圖(Omnidirectional Shadow Mapping)方法,處理的對象是點光源,因為點光源是向四周所有面發散光,所以點光源的陰影貼圖由立方體貼圖實現。該方法有兩個主要步驟:
- 創建陰影貼圖
- 進行陰影投射
在創建階段,對所有把陰影投射到陰影貼圖紋理上的物體,渲染它們到光源的距離的平方。而在投射結算,渲染所有接受陰影的物體,并比較所渲染的像素到光源的距離的平方。以下為全方位陰影映射算法的偽代碼:
for (iLight = 0; iLight < NumberOfLights; iLight++) {// Fill the shadow map.for (iObject = 0; iObject < NumberOfObjects; iObject++){RenderObjectToShadowMap(iLight, iObject);}// Lighting and shadow mapping.for (iObject = 0; iObject < NumberOfObjects; iObject++) {LightAndShadeObject (iLight, iObject);} }具體實現可以參考 源代碼http://http.download.nvidia.com/developer/GPU_Gems/CD_Image/Index.html
其中幾個重要的點:
- 從光源點出發,視域必須90度,將物體渲染進立方體貼圖六個面
- 浮點紋理和整數紋理的取樣
- PCF算法產生軟陰影(上篇文章講到的)如下代碼:
vFilter是個數組,記錄了周圍四個采樣點偏移位置,代碼中的0.25其實就是除以4的平均值,循環四次后最后相加得到最終結果
?
總結
以上是生活随笔為你收集整理的GPU Gems1 - 12 全方位的阴影映射的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 1. BeeGo 介绍与项目的创建,启动
- 下一篇: GPU Gems1 - 13 使用遮挡区