1 Shader "Hidden/BlendForBloom" {
2     Properties {
3         _MainTex (
"Screen Blended", 2D) = "" {}
4         _ColorBuffer (
"Color", 2D) = "" {}
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     
struct v2f_mt {
16         float4 pos : SV_POSITION;
17         float2 uv[
5] : TEXCOORD0;
18     };
19             
20     sampler2D _ColorBuffer;
21     sampler2D _MainTex;
22     
23     half _Intensity;
24     half4 _ColorBuffer_TexelSize;
25     half4 _MainTex_TexelSize;
26         
27     v2f vert( appdata_img v ) {
28         v2f o;
29         o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
30         o.uv[
0] = v.texcoord.xy;
31         o.uv[
1] = v.texcoord.xy;
32         
33         #
if UNITY_UV_STARTS_AT_TOP
34         
if (_ColorBuffer_TexelSize.y < 0)
35             o.uv[
1].y = 1-o.uv[1].y;
36         #endif
37         
38         
return o;
39     }
40
41     v2f_mt vertMultiTap( appdata_img v ) {
42         v2f_mt o;
43         o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
44         o.uv[
4] = v.texcoord.xy;
45         o.uv[
0] = v.texcoord.xy + _MainTex_TexelSize.xy * 0.5;
46         o.uv[
1] = v.texcoord.xy - _MainTex_TexelSize.xy * 0.5;
47         o.uv[
2] = v.texcoord.xy - _MainTex_TexelSize.xy * half2(1,-1) * 0.5;
48         o.uv[
3] = v.texcoord.xy + _MainTex_TexelSize.xy * half2(1,-1) * 0.5;
49         
return o;
50     }
51     
52     half4 fragScreen (v2f i) : SV_Target {
53         half4 addedbloom = tex2D(_MainTex, i.uv[
0].xy) * _Intensity;
54         half4 screencolor = tex2D(_ColorBuffer, i.uv[
1]);
55         
return 1-(1-addedbloom)*(1-screencolor);
56     }
57
58     half4 fragScreenCheap(v2f i) : SV_Target {
59         half4 addedbloom = tex2D(_MainTex, i.uv[
0].xy) * _Intensity;
60         half4 screencolor = tex2D(_ColorBuffer, i.uv[
1]);
61         
return 1-(1-addedbloom)*(1-screencolor);
62     }
63
64     half4 fragAdd (v2f i) : SV_Target {
65         half4 addedbloom = tex2D(_MainTex, i.uv[
0].xy);
66         half4 screencolor = tex2D(_ColorBuffer, i.uv[
1]);
67         
return _Intensity * addedbloom + screencolor;
68     }
69
70     half4 fragAddCheap (v2f i) : SV_Target {
71         half4 addedbloom = tex2D(_MainTex, i.uv[
0].xy);
72         half4 screencolor = tex2D(_ColorBuffer, i.uv[
1]);
73         
return _Intensity * addedbloom + screencolor;
74     }
75
76     half4 fragVignetteMul (v2f i) : SV_Target {
77         
return tex2D(_MainTex, i.uv[0].xy) * tex2D(_ColorBuffer, i.uv[0]);
78     }
79
80     half4 fragVignetteBlend (v2f i) : SV_Target {
81         
return half4(1,1,1, tex2D(_ColorBuffer, i.uv[0]).r);
82     }
83
84     half4 fragClear (v2f i) : SV_Target {
85         
return 0;
86     }
87
88     half4 fragAddOneOne (v2f i) : SV_Target {
89         half4 addedColors = tex2D(_MainTex, i.uv[
0].xy);
90         
return addedColors * _Intensity;
91     }
92
93     half4 frag1Tap (v2f i) : SV_Target {
94         
return tex2D(_MainTex, i.uv[0].xy);
95     }
96     
97     half4 fragMultiTapMax (v2f_mt i) : SV_Target {
98         half4 outColor = tex2D(_MainTex, i.uv[
4].xy);
99         outColor = max(outColor, tex2D(_MainTex, i.uv[
0].xy));
100         outColor = max(outColor, tex2D(_MainTex, i.uv[
1].xy));
101         outColor = max(outColor, tex2D(_MainTex, i.uv[
2].xy));
102         outColor = max(outColor, tex2D(_MainTex, i.uv[
3].xy));
103         
return outColor;
104     }
105
106     half4 fragMultiTapBlur (v2f_mt i) : SV_Target {
107         half4 outColor =
0;
108         outColor += tex2D(_MainTex, i.uv[
0].xy);
109         outColor += tex2D(_MainTex, i.uv[
1].xy);
110         outColor += tex2D(_MainTex, i.uv[
2].xy);
111         outColor += tex2D(_MainTex, i.uv[
3].xy);
112         
return outColor/4;
113     }
114
115     ENDCG
116     
117 Subshader {
118       ZTest Always Cull Off ZWrite Off
119
120  
// 0: nicer & softer "screen" blend mode
121  Pass {
122
123       CGPROGRAM
124       #pragma vertex vert
125       #pragma fragment fragScreen
126       ENDCG
127   }
128
129  
// 1: "add" blend mode
130  Pass {
131
132       CGPROGRAM
133       #pragma vertex vert
134       #pragma fragment fragAdd
135       ENDCG
136   }
137  
// 2: several taps, maxxed
138  Pass {
139
140       CGPROGRAM
141       #pragma vertex vertMultiTap
142       #pragma fragment fragMultiTapMax
143       ENDCG
144   }
145  
// 3: vignette blending
146  Pass {
147
148       CGPROGRAM
149       #pragma vertex vert
150       #pragma fragment fragVignetteMul
151       ENDCG
152   }
153   
// 4: nicer & softer "screen" blend mode(cheapest)
154  Pass {
155
156       CGPROGRAM
157       #pragma vertex vert
158       #pragma fragment fragScreenCheap
159       ENDCG
160  }
161   
// 5: "add" blend mode (cheapest)
162  Pass {
163
164       CGPROGRAM
165       #pragma vertex vert
166       #pragma fragment fragAddCheap
167       ENDCG
168   }
169  
// 6: used for "stable" downsampling (blur)
170  Pass {
171
172       CGPROGRAM
173       #pragma vertex vertMultiTap
174       #pragma fragment fragMultiTapBlur
175       ENDCG
176   }
177  
// 7: vignette blending (blend to dest)
178  Pass {
179       
180       Blend Zero SrcAlpha
181
182       CGPROGRAM
183       #pragma vertex vert
184       #pragma fragment fragVignetteBlend
185       ENDCG
186   }
187  
// 8: clear
188  Pass {
189       
190       CGPROGRAM
191       #pragma vertex vert
192       #pragma fragment fragClear
193       ENDCG
194   }
195  
// 9: fragAddOneOne
196  Pass {
197
198       Blend One One
199       
200       CGPROGRAM
201       #pragma vertex vert
202       #pragma fragment fragAddOneOne
203       ENDCG
204   }
205  
// 10: max blend
206  Pass {
207
208       BlendOp Max
209       Blend One One
210       
211       CGPROGRAM
212       #pragma vertex vert
213       #pragma fragment frag1Tap
214       ENDCG
215   }
216 }
217
218 Fallback off
219     
220 }
// shader


Gõ tìm kiếm nhanh...