Unity5中如何寫出好的透明(Transparent)效果shader?
如題,開啟Blend SrcAlpha OneMinusSrcAlpha的時候,如果ZWrite Off,模型自身的深度檢測會變得混亂,如果ZWrite On,會經常疊加到攝像機的背景顏色,請問unity在渲染透明度問題時候有沒有完美的shader?
透明渲染順序一直是深坑,所以只能用些取巧的方法去做或者避免,下面說下我自己理解的一些解決方案。
一.有些情況能自己能確定排序的,可以手動設置一下兩個物體的Queue。
例如:
1.一個mesh完全包裹了另外一個mesh的情況2.兩個平行的平面。當然,還有其他情況,要具體去分析。
二.我遇到過一種遊戲模型,是把人物和內衣分開的(別問我是什麼遊戲╮(╯▽╰)╭這跟本體無關)內衣是半透明的,然後某些角度就出現深度錯誤了,然後我導出模型的時候把內衣和人物合在一起了,然後一個mesh render有兩個材質,這樣渲染順序就沒問題了。
三.盡量使用alpha test和alpha additive去代替alpha blending。我現在的遊戲裡面的模型就是使用alpha test來做透明混合的。粒子是使用alpha additive比較多。
四,如果某類物體肯定在另外一類物體前,可以用兩個攝像機,設置layer。當然,攝像機多了一個,效率也是會有影響的,自己權衡。
五,兩個pass,一個寫深度,另外一個做alpha blending。額都沒看太懂問題 是一個半透模型前後渲染問題嗎?如果是的話 2遍pass就行了 第一遍只寫深度 如果是多物體排序 沒啥好辦法 oit又不太現實
提供一個不需像素排序的思路,理論上也是可以在u3d實現的1 render opaque objects2 upsample depth and frame buffer3 render transparent objects by alpha coverage4 downsample to framebuffer
如果有依賴深度的後處理,這方法就不好用了
透明物體兩種寫法,一種是clip,寫zwrite,好處是不會排序混亂,壞處是沒法blend,另一種就是blend,不寫zwrite,這時候就完全依賴於排序,如果你有一個物體裡面的面片互相穿插,那排序錯亂就是無解的問題。
set ZWrite On and "Queue" = "Geometry+1"
源引子:
ZWrite doesn"t work (in transparent shader)
推薦閱讀:
※我該如何進入USC遊戲設計專業?
※C# 多線程與OOP設計處理接線員?
※為什麼CryEngine、Unreal這些行業頂級引擎,代碼寫得這麼亂?
※大型3D遊戲是如何將地圖做得很大卻避免讀條的?
※在Unity 舉行的VISION SUMMIT 2016大會上主要宣布哪些新技術呢?