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 objects

2 upsample depth and frame buffer

3 render transparent objects by alpha coverage

4 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大會上主要宣布哪些新技術呢?

TAG:Unity遊戲引擎 | shader |