您好,登錄后才能下訂單哦!
目標(biāo):兩個cube,cube1在前,默認(rèn)不透明白色,cube2在后,藍(lán)色,部分被cube1遮擋
被遮擋部分也要顯示,并顯示為綠色
如下圖:
一步一步來,我們先實現(xiàn)被遮擋部分能顯示
Shader代碼:
Shader "Custom/TestZwriteAlpha" {
Properties{
_MainColor("Main Color", color) = (0,0,1,0.3)
_OutColor("Out Color", color) = (1,1,0,0.5)
}
SubShader {
Tags{"queue" = "transparent"}
pass {
blend srcalpha oneminu***calpha
ztest greater //1.
zwrite on //2.
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "unitycg.cginc"
fixed4 _MainColor;
fixed4 _OutColor;
struct v2f {
float4 pos:POSITION;
};
v2f vert(appdata_base v)
{
v2f o;
o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
return o;
}
fixed4 frag(v2f IN):COLOR
{
return _OutColor;
}
ENDCG
}
}
}
效果如下圖:
如圖,只有被遮擋的地方顯示出來了,沒被遮擋的地方不見了。
先看顯示出來的部分
先看這一句
zwrite on //2.
查看官方文檔:點擊查看
是否寫入深度緩沖區(qū),默認(rèn)是on,所以這句這里不寫也是一樣的。
ztest greater //1.
實現(xiàn)這個效果就在這一句,深度測試
看看unity官方文檔里怎么說的:點擊查看
Less小于,Greater大于,LEqual小于等于,GEqual大于等于,Equal等于,NotEqual不等于,Always總是
默認(rèn)是LEqual小于等于,解釋是繪制距離小于等于此物體的物體,在此物體后面的被遮擋隱藏
也就是說默認(rèn)情況下,只繪制能擋住它的物體以及它本身不被擋住的部分,而被它擋住的物體不繪制。
而本例用了ztest greater,大于
那就是相反的,只繪制它被擋住的部分,且在fragment中返回了一個綠色的_OutColor,
所以就出現(xiàn)了上圖的效果,沒有被遮擋的部分就不會被繪制,也就消失不見了。
那么,為了能讓沒有被遮擋的部分也能顯示,顯然要再加一個pass通道
pass {
blend srcalpha oneminu***calpha
ztest less //3.
zwrite on
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "unitycg.cginc"
fixed4 _MainColor;
fixed4 _OutColor;
struct v2f {
float4 pos:POSITION;
};
v2f vert(appdata_base v)
{
v2f o;
o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
return o;
}
fixed4 frag(v2f IN) :COLOR
{
return _MainColor;
}
ENDCG
}
注意,這里用了
ztest less //3.
如上所述,把該物體沒被遮擋的部分也繪制出來,使用_MainColor,即我們給的藍(lán)色。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。