Shader Texture中指定具体颜色进行高亮显示

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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
实现: 高亮一张texture上相同颜色的色块。<br>原理:使用step进行rgb的对比即可。<br><br><br><br>Shader "Unlit/ChooseContinent"
{   //2018年4月8日
    //for ui地图高亮所有相同的颜色块
     
    Properties
    {
        _MainTex("Texture", 2D) = "white" {}
        _SwitchColor("SwitchColor",Int) = 0 //高光还是直接返回
        _HighlightColor("HighlightColor",Color) = (0.498,1,0,0.3)//高光颜色
        _ChooseR("ChooseR",Int) = 255//点击选择的颜色值
        _ChooseG("ChooseG",Int) = 255
        _ChooseB("ChooseB",Int) = 255
        _ThresholdValue("ThresholdValue",Int) = 10//判断范围的阀值
        _VertexOffset("VertexOffset",Vector) = (5,-15,0,0)//顶点偏移
    }
 
        SubShader
        {
            Tags
        {
            "Queue" = "Transparent"
            "IgnoreProjector" = "True"
            "RenderType" = "Transparent"
            "PreviewType" = "Plane"
            "CanUseSpriteAtlas" = "True"
        }
 
 
            Cull Back
            Lighting Off
            ZWrite Off
            ZTest Off
            Blend SrcAlpha OneMinusSrcAlpha
         
 
            Pass
        {
            Name "Default"
            CGPROGRAM
    #pragma vertex vert
    #pragma fragment frag
    #pragma target 2.0
   
    #include "UnityCG.cginc"
    #include "UnityUI.cginc"
 
         struct appdata_t
        {
            float4 vertex   : POSITION;
            float4 color    : COLOR;
            float2 texcoord : TEXCOORD0;
            UNITY_VERTEX_INPUT_INSTANCE_ID
        };
 
        struct v2f
        {
            float4 vertex   : SV_POSITION;
            fixed4 color : COLOR;
            float2 texcoord  : TEXCOORD0;
            float4 worldPosition : TEXCOORD1;
            UNITY_VERTEX_OUTPUT_STEREO
        };
 
        float4 _VertexOffset;
        v2f vert(appdata_t IN)
        {
            v2f OUT;
            UNITY_SETUP_INSTANCE_ID(IN);
            UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(OUT);
            OUT.worldPosition = IN.vertex;
            OUT.vertex = UnityObjectToClipPos(OUT.worldPosition) - _VertexOffset;
            OUT.texcoord = IN.texcoord;
            return OUT;
        }
 
        sampler2D _MainTex;
        float _SwitchColor;
        float _Alpha;
        float4 _ChooseColor;
        float4 _HighlightColor;
        int _ChooseR;
        int _ChooseG;
        int _ChooseB;
        int _ThresholdValue;
        float4 frag(v2f IN) : SV_Target
        {
        if (_SwitchColor == 0)
        {
            return 0;
        }
        // sample the texture
        float4 col = tex2D(_MainTex, IN.texcoord);
 
            return  step(
        3
        , step(abs(_ChooseR - col.r * 255), _ThresholdValue)
        + step(abs(_ChooseG - col.g * 255), _ThresholdValue)
        + step(abs(_ChooseB - col.b * 255), _ThresholdValue)
        )*_HighlightColor;
 
        }
            ENDCG
        }
        }
}

  

posted @   sun_dust_shadow  阅读(549)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示