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


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

    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;
         }
     }
    
  • 相关阅读:
    CentOS7上Mongodb安装、卸载
    CentOS7上Redis安装与配置
    vmware centos7系统虚拟机复制到其他电脑后不能联网问题解决
    流程项目点水笔记
    CentOS7图形界面启动报错unable to connect to X server
    本地Chrome测试JS代码报错:XMLHttpRequest cannot load
    iptables相关操作以及简单理解端口和服务之间关系
    git revert 和 git reset的区别
    Linux中_ALIGN宏背后的原理——内存对齐
    SPI协议及其工作原理浅析
  • 原文地址:https://www.cnblogs.com/grassgarden/p/9784368.html
Copyright © 2020-2023  润新知