unity UI shader 之Overlay Mode

在这里插入图片描述

// Unity built-in shader source. Copyright (c) 2016 Unity Technologies. MIT license (see license.txt)

Shader "UI/PS-Overlay_Mode" {
Properties {
	[KeywordEnum(None,Darken,Multiply,ColorBurn,LinearBurn,Lighten,Screen,ColorDodge,LinearDodge)] _Overlay ("Overlay mode 1", Float) = 0
	[KeywordEnum(None, Overlay,SoftLight,HardLight,VividLight,LinearLight,PinLight,Difference,Exclusion)] _Overlay2 ("Overlay mode 2", Float) = 0
	_TintColor1("Color1",Color) = (1,1,1,1)
	_TintColor2("Color2",Color) = (1,1,1,1)
    _MainTex ("Particle Texture", 2D) = "white" {}
}

Category {
    Tags { "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent" "PreviewType"="Plane" }
    Blend One OneMinusSrcColor
//    Blend OneMinusSrcColor One
//	Blend SrcAlpha OneMinusSrcColor
//	Blend SrcAlpha One
//    Blend One One
//    Blend One Zero
//    Blend Zero One
//    ColorMask RGB
//    Cull Off 
    Lighting Off 
    ZWrite Off

    SubShader {
        Pass {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #pragma target 2.0
            #pragma multi_compile _OVERLAY_NONE _OVERLAY_DARKEN _OVERLAY_MULTIPLY _OVERLAY_COLORBURN _OVERLAY_LINEARBURN _OVERLAY_LIGHTEN _OVERLAY_SCREEN _OVERLAY_COLORDODGE _OVERLAY_LINEARDODGE 
			#pragma multi_compile _OVERLAY2_NONE _OVERLAY2_OVERLAY _OVERLAY2_SOFTLIGHT _OVERLAY2_HARDLIGHT _OVERLAY2_VIVIDLIGHT _OVERLAY2_LINEARLIGHT _OVERLAY2_PINLIGHT _OVERLAY2_DIFFERENCE _OVERLAY2_EXCLUSION
            #include "UnityCG.cginc"

            sampler2D _MainTex;
            float4 _MainTex_ST;
            fixed4 _TintColor1;
			fixed4 _TintColor2;
            struct appdata_t {
                float4 vertex : POSITION;
                fixed4 color : COLOR;
                float2 texcoord : TEXCOORD0;
            };

            struct v2f {
                float4 vertex : SV_POSITION;
                fixed4 color : COLOR;
                float2 texcoord : TEXCOORD0;
            };

            v2f vert (appdata_t v)
            {
                v2f o = (v2f)0;
                o.vertex =mul(UNITY_MATRIX_MVP, v.vertex);// UnityObjectToClipPos(v.vertex);
                o.color = v.color;
                o.texcoord = TRANSFORM_TEX(v.texcoord,_MainTex);
                return o;
            }

            fixed4 frag (v2f i) : SV_Target
            {
                half4 tex = tex2D(_MainTex, i.texcoord);
                half4 col = i.color * tex * _TintColor2;
//                col.rgb *= col.a;

                //Darken 变暗
				#if _OVERLAY_DARKEN
					col.rgb = min(col.rgb,col.rgb);
				#endif
					
				//Multiply 正片叠底
				#if _OVERLAY_MULTIPLY
					col.rgb = col.rgb * col.rgb; 
					col.rgb *=col.rgb*2;
	                
				#endif
				
				//ColorBurn 颜色加深
				#if _OVERLAY_COLORBURN
					col.rgb = 1.0 - (1.0 - col.rgb) / col.rgb; 
				#endif
				
				//LinearBurn 线性加深
				#if _OVERLAY_LINEARBURN
					col.rgb = col.rgb + col.rgb - 1.0; 
				#endif
				
				//Lighten 变亮
				#if _OVERLAY_LIGHTEN
					col.rgb = max(col.rgb,col.rgb);
					//col = col*_TintColor1;
				#endif
				
				//Screen 滤色
				#if _OVERLAY_SCREEN
					col.rgb = 1.0 - (1.0 - col.rgb) * (1.0 - col.rgb);
				#endif
				
				//ColorDodge 颜色减淡
				#if _OVERLAY_COLORDODGE
					col.rgb = col.rgb / (1.0 - col.rgb);
				#endif
				
				//LinearDodge(Add) 线性减淡(添加)
				#if _OVERLAY_LINEARDODGE
					col.rgb = col.rgb + col.rgb;
				#endif
				
				//Overlay 叠加
				#if _OVERLAY2_OVERLAY
					col.rgb = step(0.5, col.rgb);				
					col.rgb = lerp((col.rgb*col.rgb*2), (1.0-(2.0*(1.0-col.rgb)*(1.0-col.rgb))), col.rgb);
				#endif
				
				//Soft Light 柔光
				#if _OVERLAY2_SOFTLIGHT
					if(col.r > .5){col.r = col.r * (1.0-(1.0-col.r)*(1.0-2*col.r));}
					else{col.r = 1.0-(1.0-col.r)*(1.0-(col.r*2.0*col.r));}
					
					if(col.g > .5){col.g = col.g * (1.0-(1.0-col.g)*(1.0-2*col.g));}
					else{col.g = 1.0-(1.0-col.g)*(1.0-(col.g*2.0*col.g));}
					
					if(col.b > .5){col.b = col.b * (1.0-(1.0-col.b)*(1.0-2*col.b));}
					else{col.b = 1.0-(1.0-col.b)*(1.0-(col.b*2.0*col.b));}
				#endif
							
				//Hard Light 强光
				#if _OVERLAY2_HARDLIGHT
					if(col.r > .5){col.r = 1.0-(1.0-col.r)*(1-2*col.r);}
					else{col.r = col.r*2*col.r;}
					
					if(col.g > .5){col.g = 1.0-(1.0-col.g)*(1-2*col.g);}
					else{col.g = col.g*2*col.g;}
					
					if(col.b > .5){col.b = 1.0-(1.0-col.b)*(1-2*col.b);}
					else{col.b = col.b*2*col.b;}
				#endif
				
				//Vivid Light 亮光
				#if _OVERLAY2_VIVIDLIGHT
					if(col.r > .5){col.r = 1.0-(1.0-col.r)/(2*(col.r-.5));}
					else{col.r = col.r/(1-2*col.r);}
					
					if(col.g > .5){col.g = 1.0-(1.0-col.g)/(2*(col.g-.5));}
					else{col.g = col.g/(1-2*col.g);}
					
					if(col.b > .5){col.b = 1.0-(1.0-col.b)/(2*(col.b-.5));}
					else{col.b = col.b/(1-2*col.b);}
				#endif			
				
				//Linear Light 线性光
				#if _OVERLAY2_LINEARLIGHT
					if(col.r > .5){col.r = col.r + 2.0*(col.r - .5);}
					else{col.r = col.r + 2 * col.r - 1;}
					
					if(col.g > .5){col.g = col.g + 2.0*(col.g - .5);}
					else{col.g = col.g + 2 * col.g - 1;}
					
					if(col.b > .5){col.b = col.b + 2.0*(col.b - .5);}
					else{col.b = col.b + 2 * col.b - 1;}
				#endif
				
				//Pin Light 点光
				#if _OVERLAY2_PINLIGHT
					if(col.r > .5){col.r = max(col.r,2*(col.r-.5));}
					else{col.r = min(col.r,2*col.r);}
					
					if(col.g > .5){col.g = max(col.g,2*(col.g-.5));}
					else{col.g = min(col.g,2*col.g);}
					
					if(col.b > .5){col.b = max(col.b,2*(col.b-.5));}
					else{col.b = min(col.b,2*col.b);}
				#endif
				
				//Difference 差值	
				#if _OVERLAY2_DIFFERENCE
					col.rgb = abs(col.rgb - col.rgb);
				#endif
				
				//Exclusion 排除	
				#if _OVERLAY2_EXCLUSION
					col.rgb = .5 - 2*(col.rgb - 0.5) * (col.rgb - 0.5);
				#endif

                return col+_TintColor1;
            }
            ENDCG
        }
    }
}
}

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值