簡單陰影製做思路: 1:在角色腳底 放置一塊平板 2:shader中 根據平板傳入的矩陣 以及 光照 對角色進行變換 3: 獲得投影在地面上的陰影 4:陰影直接渲染到 屏幕上code
缺點: 上面的陰影沒法 增長半透明陰影效果,由於若是直接設置渲染陰影的 pass 爲半透明,就會致使陰影不一樣面片的陰影 之間重疊的部分顏色加深,致使半透明陰影顏色不均勻。對象
所以採用另外一種思路,將陰影做爲獨立的渲染層, 增長一個相機只用於渲染玩家陰影,使用 Camera.RenderWithShader 接口來渲染, 將陰影渲染到一個 RenderTexture 上面,接口
接着在主鏡頭的 OnRenderImage 接口中,將渲染的陰影 renderTexture 和 主鏡頭渲染的正常場景進行alpha混合。ip
上面混合主要問題是 如何處理 陰影 renderTexture和 主鏡頭渲染對象的 深度問題,防止陰影遮擋住其它對象。it
Unity中能夠設置鏡頭 Camera.depth 深度模式爲 depth,咱們設置主鏡頭深度模式depth,這樣主鏡頭就會產生一個 depthTexture; 這個depthTexture 在shader裏面能夠經過 _CameraDepthTexture 來訪問;io
接着咱們在陰影渲染shader裏面,經過這個_CameraDepthTexture 獲得陰影所在位置的深度信息,若是比陰影靠近鏡頭,咱們就將陰影裁減掉。 這樣陰影就不會遮擋住其它對象了。cli
可是再人物腳底可能會由於存在浮點數偏差,致使的一些問題,能夠在人物腳底增長黑色圓圈,來彌補這個缺陷。渲染
shader中從_CameraDepthTexture 中得到深度信息的核心代碼是:co
vert(){浮點數
v.pos = mul(MVP, vertex); v.screen = CameraScreenPos(v.pos); EyeLinear(v.screen.z); v.uv = v.pos.xy;
}
frag() {
d = SAMPLE_DEPTH_PROJ(_CameraDepthTexture, v.uv); EyeLinear(d); clip(d, v.screen, 1e-2f)
}
參考 Unity Image Effect 代碼中的: MotionBlurClear.shader
須要注意問題:
深度計算須要根據根據 投影的平面陰影來計算 不要用 原始模型計算,所以須要 ComputerSceenPos 代碼調整