• Unity中Shader通道ColorMask


    前言

    Unity中Shader通道ColorMask


    一、ColorMask是用来干什么的

    ColorMask RGB | A | 0 | R、G、B、A的任意组合
    颜色遮罩,默认值为:RGBA,表示写入RGBA四个通道

    测试代码:

    Shader"MyShader/P1_1_8"
    {
        Properties
        {
            //命名要按标准来,这个属性才可以和Unity组件中的属性产生关联
            //比如说,在更改 Image 的源图片时,同时更改这个
            [PerRendererData]_MainTex("MainTex",2D) = "white"{}
            //暴露一个变量来供模板测试中 Ref 使用
            _Ref("Stencil Ref",int) = 0
            //暴露一个变量来供模板测试中 Comp 使用
            [Enum(UnityEngine.Rendering.CompareFunction)]_StencilComp("Stencil Comp",int) = 0
            
            [Enum(UnityEngine.Rendering.StencilOp)]_StencilOp("Stencil Op",int) = 0
        }
        
        SubShader
        {
            //更改渲染队列(UI的渲染队列一般是半透明层的)
            Tags {"Queue" = "TransParent"}
            //混合模式
            Blend SrcAlpha OneMinusSrcAlpha
            
            ColorMask RG
            
            Stencil
            {
                Ref [_Ref]
                //以下两个属性一般不做修改
                //ReadMask 3//[_StencilReadMask]
                //WriteMask [_StencilWriteMask]
                Comp [_StencilComp]
                Pass [_StencilOp]
                //Fail [_Fail]
                //ZFail [_ZFail]
            }
            Pass
            {
                CGPROGRAM
                #pragma vertex  vert
                #pragma fragment frag
                #include "UnityCG.cginc"
                //存储 应用程序输入到顶点着色器的信息
                struct appdata
                {
                    //顶点信息
                    float4 vertex:POSITION;
                    float2 uv : TEXCOORD;
                    //这里定义一个语义为Color的4维向量,用于传入顶点颜色,设置语义为COLOR后,这个变量就会与顶点颜色对应
                    fixed4 color:COLOR;
                };
                //存储 顶点着色器输入到片元着色器的信息
                struct v2f
                {
                    //裁剪空间下的位置信息(SV_POSITION是必须的)
                    float4 pos:SV_POSITION;
                    float2 uv : TEXCOORD;
                    //这里的语义主要代表精度不同,TEXCOORD 在这里只是代表高精度
                    fixed4 color : TEXCOORD1;
                };
                
                sampler2D _MainTex;
                fixed4 _Color;
                v2f vert(appdata v)
                {
                    v2f o;
                    //把顶点信息转化到裁剪坐标下
                    o.pos = UnityObjectToClipPos(v.vertex);
                    o.uv = v.uv;
                    o.color = v.color;
                    return o;
                }
                fixed4 frag(v2f i) : SV_Target
                {
                    fixed4 mainTex = tex2D(_MainTex,i.uv);
                    return  mainTex * i.color;
                }
                
                ENDCG
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81

    效果:
    在这里插入图片描述

    二、怎么做到和 Unity UI 中的 Shader 一样根据UI层级自动适配Shader中模板测试值

    1、借鉴Unity官方的 UI Shader

    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述
    仿照Unity官方的UI Shader写模板测试后,就可以让自己写的 UI Shader 自动适配了
    测试代码:

    Shader"MyShader/P1_1_8"
    {
        Properties
        {
            //命名要按标准来,这个属性才可以和Unity组件中的属性产生关联
            //比如说,在更改 Image 的源图片时,同时更改这个
            [PerRendererData]_MainTex("MainTex",2D) = "white"{}
            _StencilComp ("Stencil Comparison", Float) = 8.000000
            _Stencil ("Stencil ID", Float) = 0.000000
            _StencilOp ("Stencil Operation", Float) = 0.000000
            _StencilWriteMask ("Stencil Write Mask", Float) = 255.000000
            _StencilReadMask ("Stencil Read Mask", Float) = 255.000000
            _ColorMask ("Color Mask", Float) = 15.000000
        }
        
        SubShader
        {
            //更改渲染队列(UI的渲染队列一般是半透明层的)
            Tags {"Queue" = "TransParent"}
            //混合模式
            Blend SrcAlpha OneMinusSrcAlpha
            
            ColorMask [_ColorMask]
            
            Stencil
            {
                Ref [_Stencil]
                ReadMask [_StencilReadMask]
                WriteMask [_StencilWriteMask]
                Comp [_StencilComp]
                Pass [_StencilOp]
            }
            Pass
            {
                CGPROGRAM
                #pragma vertex  vert
                #pragma fragment frag
                #include "UnityCG.cginc"
                //存储 应用程序输入到顶点着色器的信息
                struct appdata
                {
                    //顶点信息
                    float4 vertex:POSITION;
                    float2 uv : TEXCOORD;
                    //这里定义一个语义为Color的4维向量,用于传入顶点颜色,设置语义为COLOR后,这个变量就会与顶点颜色对应
                    fixed4 color:COLOR;
                };
                //存储 顶点着色器输入到片元着色器的信息
                struct v2f
                {
                    //裁剪空间下的位置信息(SV_POSITION是必须的)
                    float4 pos:SV_POSITION;
                    float2 uv : TEXCOORD;
                    //这里的语义主要代表精度不同,TEXCOORD 在这里只是代表高精度
                    fixed4 color : TEXCOORD1;
                };
                
                sampler2D _MainTex;
                fixed4 _Color;
                v2f vert(appdata v)
                {
                    v2f o;
                    //把顶点信息转化到裁剪坐标下
                    o.pos = UnityObjectToClipPos(v.vertex);
                    o.uv = v.uv;
                    o.color = v.color;
                    return o;
                }
                fixed4 frag(v2f i) : SV_Target
                {
                    fixed4 mainTex = tex2D(_MainTex,i.uv);
                    return  mainTex * i.color;
                }
                
                ENDCG
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78

    效果:(自己写的UI Shader属性面板已经变灰了,由程序自动修改)
    在这里插入图片描述

  • 相关阅读:
    SpringDataJPA系列1:JDBC、ORM、JPA、Spring Data JPA,傻傻分不清楚?给你个选择SpringDataJPA的理由!
    MyBatis入门案例及实现增删改查
    div+css 设备看板样式
    1.4+1.5 L1、L2正则化
    云服务器ip使用细节(公网、私有)
    【C++实战】 语言特性
    WPF Flyout风格动画消息弹出消息提示框
    竹间智能用认知智能为企业的发展提供助力
    智慧机场航线监测系统:提升航空运输安全与效率的新一步
    postman 正则提取html里的值
  • 原文地址:https://blog.csdn.net/qq_51603875/article/details/133149859