1. 程式人生 > >Shader做剪影效果

Shader做剪影效果

exc cli 改變 cnblogs return sample 我不 內置 圖片

某渣渣甩了一個需求給我,並且說我不會寫。我明知是激將法,但是想想這需求也太簡單了,我好像也不怎麽會QAQ。為了表示我對shader的熱愛,寫就寫。


需求是這樣的:

這是一個漂亮的MM,但是渣渣不想讓人知道,想把她變成影子,但是他自己又不想做多一張圖片,畢竟也想影子的顏色隨便改變(總之渣渣的世界借口很多就是)。

技術分享----------->------------>----------->--------->技術分享


分析下如何實現吧:

首先要把MM顯示出來,因為圖片除了人物,其它地方都是透明的,那麽肯定要用到透明混合的。其次,要先把整個人物變成黑色,然後再上其它顏色。

為什麽要變成黑色呢?

因為黑色的顏色值是(0,0,0),也就是黑色加什麽顏色就等於什麽顏色(0+x = x),而黑色乘上任何顏色值都等於黑色(0 * x = 0)。

為什麽不白色呢?

因為白色的顏色值是(1,1,1),bralabalala............


好了,分析完了,那麽就動手吧(其實實際是先動手了再分析的= =,所以說總結很重要嗎!?)

Shader "CharmingShader/Cartoon001/Unlit"
{
    Properties
    {
        _MainTex("Main Tex",2D) = "white"{}
        _Tint("Color",Color) = (1
,1,1,1) } SubShader { Tags{ "RenderType" = "Transparent" "Queue"="Transparent"} Pass { ZWrite Off Blend SrcAlpha OneMinusSrcAlpha CGPROGRAM #pragma vertex vert #pragma fragment frag #include
"UnityCG.cginc" sampler2D _MainTex; float4 _MainTex_ST; fixed4 _Tint; struct a2v { float4 vertex : POSITION; float2 texcoord : TEXCOORD0; }; struct v2f { float2 uv :TEXCOORD0; float4 pos : SV_POSITION; }; v2f vert(a2v a) { v2f f; f.uv = TRANSFORM_TEX(a.texcoord, _MainTex); f.pos = mul(UNITY_MATRIX_MVP, a.vertex); return f; } fixed4 frag (v2f i) :SV_Target { fixed4 col = tex2D(_MainTex,i.uv); fixed4 colo = col*fixed4(0, 0, 0, 1) + fixed4(_Tint.rgb,0); return colo; } ENDCG } } }

代碼還是很簡單的,關鍵的代碼可能就是這行

                fixed4 colo = col*fixed4(0, 0, 0, 1) + fixed4(_Tint.rgb,0);

怎麽解釋呢?。。。。。

其實就是,因為圖片肯定是方形的(包括透明部分),不透明部分的數值相當於(x0,y0,z0,1)。

(x0,y0,z0,1)*(0,0,0,1) = (0,0,0,1) 也就相當於黑色。最後(0,0,0,1)+(_Tint.rgb,0) = (_Tint.rgb,1)也就是要上的顏色了。

對於透明部分,原始數值相當於(x1,y1,z1,0),(x1,y1,z1,0)*(0,0,0,1) = (0,0,0,0)也是透明的。

最後(0,0,0,0)+(_Tint.rgb,0) = (_Tint.rgb,0)同樣也是透明的。

綜上就可以達到預期的效果了。

當然筆者認為使用內置的clip函數會適用性更廣點,但以上的方法更加鍛煉思維能力吧(明明就自己不會QAQ)。總之,方法沒有好壞,只有適不適合。

ps:眼睛看到的永遠是表象,背後的事實有時候不要去了解,畢竟好看就行了。。。

Shader做剪影效果