Unity 實時 半透明 陰影 shader

簡單陰影製做思路: 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 代碼調整

相關文章
相關標籤/搜索