在unity中我們通常有兩種方法可以實現透明效果
透明度測試只能控制物體完全透明或者完全不透明,所以大部分情況下使用的都是透明度混合的效果
透明度混合需要考慮渲染順序.之前從來沒考慮過渲染順序的問題是因為對於不透明物體,有深度緩衝這種機制的存在.
深度緩衝會對物體進行深度測試,原理利用快取中的深度判斷物體與攝像機之間的距離.
渲染乙個片元時,如果它的深度比快取深度高,說明它已經被某個物體遮擋住了,不應該渲染出來.
否則就渲染這個片元,並把顏色存入深度快取中.
使用深度緩衝,我們不必關心渲染順序,因為深度緩衝會判斷相機的位置來進行渲染.而我們使用透明度混合時,被透明物體遮擋的物體,不論他的深度是否大於深度快取,都應該被渲染出來.這就產生了矛盾.所以我們使用透明度混合時,是需要關閉深度寫入的.這樣不會更新深度快取的值.
我們只關閉了深度寫入,並沒有關閉深度測試,所以不透明的物體依然可以遮擋透明物體.
unity為我們提供了乙個預設的渲染佇列來解決這個問題.
我們可以通過定義tag的方式實現透明度測試或者透明度混合
tags//透明度測試
tags//透明度混合
「ignoreprojector」="true"關閉投影器影響
「rendertype」="transparent"的作用請參考這篇文章
shader "custom/newsu***ceshader"
//貼圖紋理
_cutoff("alpha cutoff",range(0,1))=0.5//透明度測試中低於這個值的顏色會被消除
} subshader
pass
cgprogram
#include "lighting.cginc"
#pragma vertex vert
#pragma fragment frag
fixed4 _color;//貼圖顏色
sampler2d _maintex;//貼圖紋理
fixed _cutoff;
float4 _maintex_st;
struct a2v ;
struct v2f ;
v2f vert(a2v v)
fixed4 frag(v2f f) :sv_target
endcg
} }fallback "transparent/cutout/vertexlit"//設定合適的fallback
}
低於_cutoff的部分完全透明,看起來像個無頭騎士一樣
//貼圖紋理
_alphascale("_alphascale",range(0,1))=1//透明度
} subshader
pass
zwrite off//關閉深度寫入
blend srcalpha oneminussrcalpha//設定混合因子 開啟透明混合
cgprogram
#include "lighting.cginc"
#pragma vertex vert
#pragma fragment frag
fixed4 _color;//貼圖顏色
sampler2d _maintex;//貼圖紋理
fixed _alphascale;
float4 _maintex_st;
struct a2v ;
struct v2f ;
v2f vert(a2v v)
fixed4 frag(v2f f) :sv_target
endcg
} }fallback "transparent/vertexlit"//設定合適的fallback
Shader筆記 7 透明效果
不透明物體 渲染不透明物體時,即使不去考慮不透明的物體opaque之間的渲染順序,也可以得到正確的渲染結果,是由於強大的深度緩衝depth buffer z buffer的存在,深度緩衝用於解決片元可見性問題,即物體哪些部分被渲染在前面,哪些部分被遮擋 透明物體 渲染透明物體時,不僅要關注渲染圖元上...
開啟深度寫入的半透明效果 Shader
思路 第乙個pass開啟深度寫入,但不輸出顏色,它的目的僅僅是為了把該模型的深度值寫入深度緩衝中 第二個pass進行正常的透明度混合,由於上乙個pass已經得到了逐畫素的正確的深度資訊,該pass就可以按照畫素級別的深度排序結果進行透明渲染。shader chapter8 alphablendzwr...
Shader學習的基礎知識(六)透明效果
在渲染的時候,渲染的順序是非常重要的,對於不透明物體我們不用不考慮是因為有的深度緩衝存在。在渲染時需要把片元中的值進行比較 如果開了深度測試 但一但關了嘗試測試就沒那麼簡單了。透明度測試 只要小於閾值就會被捨棄,完全不透明或完全透明。透明度混合 這種方法才能得到真正的透明效果,但是需要關掉深度測試,...