1 Shader "Hidden/BlendModesOverlay" {
2 Properties {
3 _MainTex ("Screen Blended", 2D) = "" {}
4 _Overlay ("Color", 2D) = "grey" {}
5 }
6
7 CGINCLUDE
8
9 #include "UnityCG.cginc"
10
11 struct v2f {
12 float4 pos : SV_POSITION;
13 float2 uv[2] : TEXCOORD0;
14 };
15
16 sampler2D _Overlay;
17 sampler2D _MainTex;
18
19 half _Intensity;
20 half4 _MainTex_TexelSize;
21 half4 _UV_Transform = half4(1, 0, 0, 1);
22
23 v2f vert( appdata_img v ) {
24 v2f o;
25 o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
26
27 o.uv[0] = float2(
28 dot(v.texcoord.xy, _UV_Transform.xy),
29 dot(v.texcoord.xy, _UV_Transform.zw)
30 );
31
32 #if UNITY_UV_STARTS_AT_TOP
33 if(_MainTex_TexelSize.y<0.0)
34 o.uv[0].y = 1.0-o.uv[0].y;
35 #endif
36
37 o.uv[1] = v.texcoord.xy;
38 return o;
39 }
40
41 half4 fragAddSub (v2f i) : SV_Target {
42 half4 toAdd = tex2D(_Overlay, i.uv[0]) * _Intensity;
43 return tex2D(_MainTex, i.uv[1]) + toAdd;
44 }
45
46 half4 fragMultiply (v2f i) : SV_Target {
47 half4 toBlend = tex2D(_Overlay, i.uv[0]) * _Intensity;
48 return tex2D(_MainTex, i.uv[1]) * toBlend;
49 }
50
51 half4 fragScreen (v2f i) : SV_Target {
52 half4 toBlend = (tex2D(_Overlay, i.uv[0]) * _Intensity);
53 return 1-(1-toBlend)*(1-(tex2D(_MainTex, i.uv[1])));
54 }
55
56 half4 fragOverlay (v2f i) : SV_Target {
57 half4 m = (tex2D(_Overlay, i.uv[0]));// * 255.0;
58 half4 color = (tex2D(_MainTex, i.uv[1]));//* 255.0;
59
60 // overlay blend mode
61 //color.rgb = (color.rgb/255.0) * (color.rgb + ((2*m.rgb)/( 255.0 )) * (255.0-color.rgb));
62 //color.rgb /= 255.0;
63
64 /*
65 if (Target > ½) R = 1 - (1-2x(Target-½)) x (1-Blend)
66 if (Target <= ½) R = (2xTarget) x Blend
67 */
68
69 float3 check = step(0.5, color.rgb);
70 float3 result = 0;
71
72 result = check * (half3(1,1,1) - ( (half3(1,1,1) - 2*(color.rgb-0.5)) * (1-m.rgb)));
73 result += (1-check) * (2*color.rgb) * m.rgb;
74
75 return half4(lerp(color.rgb, result.rgb, (_Intensity)), color.a);
76 }
77
78 half4 fragAlphaBlend (v2f i) : SV_Target {
79 half4 toAdd = tex2D(_Overlay, i.uv[0]) ;
80 return lerp(tex2D(_MainTex, i.uv[1]), toAdd, toAdd.a);
81 }
82
83
84 ENDCG
85
86 Subshader {
87 ZTest Always Cull Off ZWrite Off
88 ColorMask RGB
89
90 Pass {
91
92 CGPROGRAM
93 #pragma vertex vert
94 #pragma fragment fragAddSub
95 ENDCG
96 }
97
98 Pass {
99
100 CGPROGRAM
101 #pragma vertex vert
102 #pragma fragment fragScreen
103 ENDCG
104 }
105
106 Pass {
107
108 CGPROGRAM
109 #pragma vertex vert
110 #pragma fragment fragMultiply
111 ENDCG
112 }
113
114 Pass {
115
116 CGPROGRAM
117 #pragma vertex vert
118 #pragma fragment fragOverlay
119 ENDCG
120 }
121
122 Pass {
123
124 CGPROGRAM
125 #pragma vertex vert
126 #pragma fragment fragAlphaBlend
127 ENDCG
128 }
129 }
130
131 Fallback off
132
133 } // shader