shadowmap是比較流行的實時陰影實現方案,原理比較簡單,但真正實現起來還是會遇到很多問題的,我這裡主要記錄下實現方式
先看效果
實現原理
shadowmap技術是從燈光空間用相機渲染一張rendertexture,把深度值寫入其中所以稱之為深度圖,在把接受陰影的物體從模型空間轉換到燈光空間中,獲取深度圖裡的深度進行比較,如果深度值比深度圖中取出的值大就說明該點為陰影。
《cg教程_可程式設計實時圖形權威指南》書上說的原理
陰影對映是乙個雙過程的技術:
1、 首先,場景以光源的位置為視點被渲染。每個渲染影象的畫素的深度被記錄在乙個「深度紋理」中(這個紋理通常被稱為陰影貼圖)。
2、 然後,場景從眼睛的位置渲染,但是用標準的陰影紋理把陰影貼圖從燈的位置投影到場景中。在每個畫素,深度取樣(從被投影的陰影貼圖紋理)與片段到燈的距離進行比較。如果後者大,該畫素就不是最靠近燈源的表面。這意味著這個片段是陰影,它在著色過程中不應該接受光照。
第一步:生成深度圖shader
把視點空間的z值深度傳入片段找色器裡除以w轉換為其次座標,為啥要傳入片段找色器處理呢?因為gpu會對片段找色器傳入的引數進行插值計算,這樣才能更精確的計算出深度。
計算出深度之後,要轉換到一張裡儲存起來,如何把乙個float存入中呢?
shader "lijia/deapthtextureshader"
}subshader
lod 100
pass
;struct v2f
;sampler2d _maintex;
float4 _maintex_st;
fixed4 frag (v2f i) : sv_target
endcg}}
}
第二步:接受陰影的shader
假如有一塊地板作為接受陰影的物體,在這個物體上執行該shader
把深度值傳入片段著色器裡,在片段著色器中除以w轉換為其次座標的深度值(跟生成深度圖的shader一樣處理)
把頂點轉換到燈光的視點空間,這裡是傳入乙個lijia_projectionmatrix 矩陣計算的
取出該畫素對應深度圖上的顏色值,轉換成深度值
把該畫素的深度值跟深度圖裡取出來的值進行比較,如果比深度圖裡的大,該點就為陰影
shader "swan/shadowmap/shadowmapnormal"
}subshader
;float4x4 lijia_projectionmatrix;
sampler2d lijia_depthtexture;
fixed4 frag(v2f v) : color
return col*shadowscale;
}endcg}}
}
第三步:寫乙個指令碼呼叫上面的2個shader
上面我們已經建立好了2個shader
生成深度圖的deapthtextureshader.shader
接受陰影的shadowmapnormal(我這裡把t4m跟接收光照貼圖的處理都寫進去了)
指令碼主要做的事情
建立乙個相機把角度設定的跟燈光一樣,渲染出一張深度圖傳入給接受陰影的shader(畫素越高陰影的精度越高,但是消耗也就越大)
計算好頂點轉換到燈光空間的矩陣傳入給接受陰影的shader
using unityengine;
using system.collections;
namespace swanengine.core
void update()}}
後面的話
幾乎所有的**我都貼上來了,有一些shader基礎的話應該是可以實現出效果的,希望能夠幫助到你們理解shadowmap
在unity裡動態陰影的實現方式還有很多,這裡有個大合集
posted @
2017-07-24 22:39
李嘉的部落格 閱讀(
...)
編輯收藏
CSS裡的陰影屬性應用
text shadow 是css文字陰影屬性單詞。text shodw 屬性值1 屬性值2 屬性值3 屬性值4 屬性值1 陰影橫向位置 屬性值2 陰影縱向位置 屬性值3 陰影的大小 屬性值4 陰影的顏色 下面做個示範 text shadow屬性值裡的30px就是陰影向右移動30畫素,20px是向下移...
遊戲裡的程式設計遊戲
我想寫一本書,當然本身帶有功利性,不必諱言,它並不是一本正兒八經的技術著作,它主要關於我人生裡的遊戲,遊戲裡的程式設計。最終未必能出書也並不特別重要,出不了無非是筆者水平不足或沒有遇到自己的伯樂。同樣重要的是,如果我能通過這個平台去分享我的遊戲經歷,我的人生,能得到諸位關注和共鳴,也是人生的一件快事...
遊戲引擎筆記(四)遊戲中的陰影技術
幾個重要的緩衝區 1.後台緩衝區 render target view 渲染目標檢視 2.前台緩衝區 不能直接繪製到前台緩衝區,會產生頻閃現象 使用翻轉鏈 swap chain 機制 前後臺緩衝區解析度相同 超取樣技術 將後台緩衝區的影象壓縮到前台緩衝區,使影象密度提高 3.深度緩衝區 與後台緩衝區...