Unity 灰度Shader(支持UGUI Mask裁剪)

本文章只做纪录,来源:https://www.cnblogs.com/grassgarden/p/9784368.html

shader源码如下 其中支持mask裁剪部分(注意 有两处地方需要添加)的代码同样适合其他自定义shader

Shader "Custom/UISprite" {
	Properties
	{
	   _MainTex("Base (RGB), Alpha (A)", 2D) = "white" {}

	//支持Mask 裁剪的部分
	//Start
	_StencilComp("Stencil Comparison", Float) = 8
	_Stencil("Stencil ID", Float) = 0
	_StencilOp("Stencil Operation", Float) = 0
	_StencilWriteMask("Stencil Write Mask", Float) = 255
	_StencilReadMask("Stencil Read Mask", Float) = 255
	_ColorMask("Color Mask", Float) = 15
	//End
	}

		SubShader
	{
	 LOD 200
	 Tags
	 {
	  "Queue" = "Transparent"
	  "IgnoreProjector" = "True"
	  "RenderType" = "Transparent"
	 }
	//支持Mask 裁剪的部分
	//Start
	 Stencil
	 {
	   Ref[_Stencil]
	   Comp[_StencilComp]
	   Pass[_StencilOp]
	   ReadMask[_StencilReadMask]
	   WriteMask[_StencilWriteMask]
	 }
	 ColorMask[_ColorMask]
	 //End
	 Pass
	 {
	  Cull Off
	  Lighting Off
	  ZWrite Off
	  Fog { Mode Off }
	  ColorMask RGB
	  AlphaTest Greater .01
	  Blend SrcAlpha OneMinusSrcAlpha
	  ColorMaterial AmbientAndDiffuse

	  CGPROGRAM
	  #pragma vertex vert
	  #pragma fragment frag
	  #include "UnityCG.cginc"
	  sampler2D _MainTex;
	  struct appdata_t
	  {
	   float4 vertex : POSITION;
	   half4 color : COLOR;
	   float2 texcoord : TEXCOORD0;
	  };
	  struct v2f
	  {
	   float4 vertex : POSITION;
	   half4 color : COLOR;
	   float2 texcoord : TEXCOORD0;
	  };
	  v2f vert(appdata_t v)
	  {
	   v2f o;
	   o.vertex = UnityObjectToClipPos(v.vertex);
	   o.color = v.color;
	   o.texcoord = v.texcoord;
	   return o;
	  }
	  half4 frag(v2f IN) : COLOR
	  {
		  half4 col = tex2D(_MainTex, IN.texcoord) * IN.color;
		  float c = 0.299*col.r + 0.587*col.g + 0.184*col.b;
		  col.r = col.g = col.b = c;
		  return col;
		 }
		 ENDCG
		}
	}
}

!!注意:

支持Mask后在Mask物体下,Image的Material的属性只有第一次赋值时有效,无法动态修改,如果有需求就要新建一个脚本继承Image并重写GetModifiedMaterial方法。

重写代码如下

public class CustomImage : Image
 {
     public override Material GetModifiedMaterial(Material baseMaterial)
     {
         Material cModifiedMat = base.GetModifiedMaterial(baseMaterial);
         return cModifiedMat;
     }
 }

再来个重复的,老老实实做个缝合怪

Shader "Custom/ImageGreyShader" {

 Properties     

    {     

        [PerRendererData] _MainTex ("Sprite Texture", 2D) = "white" {}  

        _Color ("Tint", Color) = (1,1,1,1)  

       //支持Mask 裁剪的部分
	//Start
	_StencilComp("Stencil Comparison", Float) = 8
	_Stencil("Stencil ID", Float) = 0
	_StencilOp("Stencil Operation", Float) = 0
	_StencilWriteMask("Stencil Write Mask", Float) = 255
	_StencilReadMask("Stencil Read Mask", Float) = 255
	_ColorMask("Color Mask", Float) = 15
	//End


    }     

         SubShader     

    {     

        Tags     

        {      

            "Queue"="Transparent"     

            "IgnoreProjector"="True"      

            "RenderType"="Transparent"      

            "PreviewType"="Plane"     

            "CanUseSpriteAtlas"="True"     

        }     
        //支持Mask 裁剪的部分
	//Start
	 Stencil
	 {
	   Ref[_Stencil]
	   Comp[_StencilComp]
	   Pass[_StencilOp]
	   ReadMask[_StencilReadMask]
	   WriteMask[_StencilWriteMask]
	 }
	 ColorMask[_ColorMask]
	 //End

        // 源rgba*源a + 背景rgba*(1-源A值)   

        Blend SrcAlpha OneMinusSrcAlpha  

             Pass     

        {     

            CGPROGRAM     

            #pragma vertex vert     

            #pragma fragment frag    

            #include "UnityCG.cginc"     

                             struct appdata_t     

            {     

                float4 vertex   : POSITION;     

                float4 color    : COLOR;     

                float2 texcoord : TEXCOORD0;     

            };     

                 struct v2f     

            {     

                float4 vertex   : SV_POSITION;     

                fixed4 color    : COLOR;    

                half2 texcoord  : TEXCOORD0;     

            };     

                           sampler2D _MainTex;     

            fixed4 _Color;     

                 v2f vert(appdata_t IN)     

            {     

                v2f OUT;     

                OUT.vertex = UnityObjectToClipPos(IN.vertex);     

                OUT.texcoord = IN.texcoord;     

#ifdef UNITY_HALF_TEXEL_OFFSET     

                OUT.vertex.xy -= (_ScreenParams.zw-1.0);    

#endif     

                OUT.color = IN.color * _Color;     

                return OUT;  

            }  

                 fixed4 frag(v2f IN) : SV_Target     

            {     

                half4 color = tex2D(_MainTex, IN.texcoord) * IN.color;  

                float grey = dot(color.rgb, fixed3(0.22, 0.707, 0.071));   

                return half4(grey,grey,grey,color.a);     

            }     

            ENDCG     

      }    

    }     

}

再次说明:来源:https://www.cnblogs.com/grassgarden/p/9784368.html

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值