溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

ShaderLab學(xué)習(xí)小結(jié)(十三)物體被遮擋部分也能顯示顏色

發(fā)布時間:2020-06-08 15:33:21 來源:網(wǎng)絡(luò) 閱讀:2350 作者:lreach 欄目:游戲開發(fā)

目標(biāo):兩個cube,cube1在前,默認(rèn)不透明白色,cube2在后,藍(lán)色,部分被cube1遮擋
被遮擋部分也要顯示,并顯示為綠色
如下圖:
ShaderLab學(xué)習(xí)小結(jié)(十三)物體被遮擋部分也能顯示顏色
一步一步來,我們先實現(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
        }
    }
}

效果如下圖:
ShaderLab學(xué)習(xí)小結(jié)(十三)物體被遮擋部分也能顯示顏色
如圖,只有被遮擋的地方顯示出來了,沒被遮擋的地方不見了。
先看顯示出來的部分
先看這一句

zwrite on                                //2.

查看官方文檔:點擊查看
ShaderLab學(xué)習(xí)小結(jié)(十三)物體被遮擋部分也能顯示顏色
是否寫入深度緩沖區(qū),默認(rèn)是on,所以這句這里不寫也是一樣的。

ztest greater                         //1.

實現(xiàn)這個效果就在這一句,深度測試
看看unity官方文檔里怎么說的:點擊查看
ShaderLab學(xué)習(xí)小結(jié)(十三)物體被遮擋部分也能顯示顏色
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)色。

向AI問一下細(xì)節(jié)

免責(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)容。

AI