unity 半透明混合问题_Unity 实时 半透明 阴影 shader
簡單陰影制作思路:
1:在角色腳底 放置一塊平板
2:shader中 根據平板傳入的矩陣 以及 光照 對角色進行變換
3: 得到投影在地面上的陰影
4:陰影直接渲染到 屏幕上
缺點:
上面的陰影無法 增加半透明陰影效果,因為如果直接設置渲染陰影的 pass 為半透明,就會導致陰影不同面片的陰影 之間重疊的部分顏色加深,導致半透明陰影顏色不均勻。
因此采用另一種思路,將陰影作為獨立的渲染層, 增加一個相機只用于渲染玩家陰影,使用
Camera.RenderWithShader 接口來渲染,
將陰影渲染到一個 RenderTexture 上面,
接著在主鏡頭的 OnRenderImage 接口中,將渲染的陰影 renderTexture 和 主鏡頭渲染的正常場景進行alpha混合。
上面混合主要問題是 如何處理 陰影 renderTexture和 主鏡頭渲染對象的 深度問題,防止陰影遮擋住其它對象。
Unity中可以設置鏡頭 Camera.depth 深度模式為 depth,我們設置主鏡頭深度模式depth,這樣主鏡頭就會產生一個 depthTexture;
這個depthTexture 在shader里面可以通過 _CameraDepthTexture 來訪問;
接著我們在陰影渲染shader里面,通過這個_CameraDepthTexture 得到陰影所在位置的深度信息,如果比陰影靠近鏡頭,我們就將陰影裁減掉。
這樣陰影就不會遮擋住其它對象了。
但是再人物腳底可能會因為存在浮點數誤差,導致的一些問題,可以在人物腳底增加黑色圓圈,來彌補這個缺陷。
shader中從_CameraDepthTexture 中獲得深度信息的核心代碼是:
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 代碼調整
總結
以上是生活随笔為你收集整理的unity 半透明混合问题_Unity 实时 半透明 阴影 shader的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 地下城与勇士DNF武神装备选择
- 下一篇: ddr5内存上市时间_DDR5内存明年才