t1 / TFDContents / Assets / Resources / BlurShader4.shader @ 9
이력 | 보기 | 이력해설 | 다운로드 (4.91 KB)
1 | 3 | KTH | // Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)' |
---|---|---|---|
2 | |||
3 | |||
4 | Shader "Custom/BlurShader4" { |
||
5 | Properties { |
||
6 | _MainTex ("Base (RGB)", 2D) = "white" {} |
||
7 | } |
||
8 | |||
9 | CGINCLUDE |
||
10 | |||
11 | #include "UnityCG.cginc" |
||
12 | |||
13 | sampler2D _MainTex; |
||
14 | |||
15 | uniform half4 _MainTex_TexelSize; |
||
16 | uniform half4 _Parameter; |
||
17 | |||
18 | struct v2f_tap |
||
19 | { |
||
20 | float4 pos : SV_POSITION; |
||
21 | half2 uv20 : TEXCOORD0; |
||
22 | half2 uv21 : TEXCOORD1; |
||
23 | half2 uv22 : TEXCOORD2; |
||
24 | half2 uv23 : TEXCOORD3; |
||
25 | }; |
||
26 | |||
27 | v2f_tap vert4Tap ( appdata_img v ) |
||
28 | { |
||
29 | v2f_tap o; |
||
30 | |||
31 | o.pos = UnityObjectToClipPos (v.vertex); |
||
32 | o.uv20 = v.texcoord + _MainTex_TexelSize.xy; |
||
33 | o.uv21 = v.texcoord + _MainTex_TexelSize.xy * half2(-0.5h,-0.5h); |
||
34 | o.uv22 = v.texcoord + _MainTex_TexelSize.xy * half2(0.5h,-0.5h); |
||
35 | o.uv23 = v.texcoord + _MainTex_TexelSize.xy * half2(-0.5h,0.5h); |
||
36 | |||
37 | return o; |
||
38 | } |
||
39 | |||
40 | fixed4 fragDownsample ( v2f_tap i ) : SV_Target |
||
41 | { |
||
42 | fixed4 color = tex2D (_MainTex, i.uv20); |
||
43 | color += tex2D (_MainTex, i.uv21); |
||
44 | color += tex2D (_MainTex, i.uv22); |
||
45 | color += tex2D (_MainTex, i.uv23); |
||
46 | return color / 4; |
||
47 | } |
||
48 | |||
49 | // weight curves |
||
50 | |||
51 | static const half curve[7] = { 0.0205, 0.0855, 0.232, 0.324, 0.232, 0.0855, 0.0205 }; // gauss'ish blur weights |
||
52 | |||
53 | static const half4 curve4[7] = { half4(0.0205,0.0205,0.0205,0), half4(0.0855,0.0855,0.0855,0), half4(0.232,0.232,0.232,0), |
||
54 | half4(0.324,0.324,0.324,1), half4(0.232,0.232,0.232,0), half4(0.0855,0.0855,0.0855,0), half4(0.0205,0.0205,0.0205,0) }; |
||
55 | |||
56 | struct v2f_withBlurCoords8 |
||
57 | { |
||
58 | float4 pos : SV_POSITION; |
||
59 | half4 uv : TEXCOORD0; |
||
60 | half2 offs : TEXCOORD1; |
||
61 | }; |
||
62 | |||
63 | struct v2f_withBlurCoordsSGX |
||
64 | { |
||
65 | float4 pos : SV_POSITION; |
||
66 | half2 uv : TEXCOORD0; |
||
67 | half4 offs[3] : TEXCOORD1; |
||
68 | }; |
||
69 | |||
70 | v2f_withBlurCoords8 vertBlurHorizontal (appdata_img v) |
||
71 | { |
||
72 | v2f_withBlurCoords8 o; |
||
73 | o.pos = UnityObjectToClipPos (v.vertex); |
||
74 | |||
75 | o.uv = half4(v.texcoord.xy,1,1); |
||
76 | o.offs = _MainTex_TexelSize.xy * half2(1.0, 0.0) * _Parameter.x; |
||
77 | |||
78 | return o; |
||
79 | } |
||
80 | |||
81 | v2f_withBlurCoords8 vertBlurVertical (appdata_img v) |
||
82 | { |
||
83 | v2f_withBlurCoords8 o; |
||
84 | o.pos = UnityObjectToClipPos (v.vertex); |
||
85 | |||
86 | o.uv = half4(v.texcoord.xy,1,1); |
||
87 | o.offs = _MainTex_TexelSize.xy * half2(0.0, 1.0) * _Parameter.x; |
||
88 | |||
89 | return o; |
||
90 | } |
||
91 | |||
92 | half4 fragBlur8 ( v2f_withBlurCoords8 i ) : SV_Target |
||
93 | { |
||
94 | half2 uv = i.uv.xy; |
||
95 | half2 netFilterWidth = i.offs; |
||
96 | half2 coords = uv - netFilterWidth * 3.0; |
||
97 | |||
98 | half4 color = 0; |
||
99 | for( int l = 0; l < 7; l++ ) |
||
100 | { |
||
101 | half4 tap = tex2D(_MainTex, coords); |
||
102 | color += tap * curve4[l]; |
||
103 | coords += netFilterWidth; |
||
104 | } |
||
105 | return color; |
||
106 | } |
||
107 | |||
108 | |||
109 | v2f_withBlurCoordsSGX vertBlurHorizontalSGX (appdata_img v) |
||
110 | { |
||
111 | v2f_withBlurCoordsSGX o; |
||
112 | o.pos = UnityObjectToClipPos (v.vertex); |
||
113 | |||
114 | o.uv = v.texcoord.xy; |
||
115 | half2 netFilterWidth = _MainTex_TexelSize.xy * half2(1.0, 0.0) * _Parameter.x; |
||
116 | half4 coords = -netFilterWidth.xyxy * 3.0; |
||
117 | |||
118 | o.offs[0] = v.texcoord.xyxy + coords * half4(1.0h,1.0h,-1.0h,-1.0h); |
||
119 | coords += netFilterWidth.xyxy; |
||
120 | o.offs[1] = v.texcoord.xyxy + coords * half4(1.0h,1.0h,-1.0h,-1.0h); |
||
121 | coords += netFilterWidth.xyxy; |
||
122 | o.offs[2] = v.texcoord.xyxy + coords * half4(1.0h,1.0h,-1.0h,-1.0h); |
||
123 | |||
124 | return o; |
||
125 | } |
||
126 | |||
127 | v2f_withBlurCoordsSGX vertBlurVerticalSGX (appdata_img v) |
||
128 | { |
||
129 | v2f_withBlurCoordsSGX o; |
||
130 | o.pos = UnityObjectToClipPos (v.vertex); |
||
131 | |||
132 | o.uv = half4(v.texcoord.xy,1,1); |
||
133 | half2 netFilterWidth = _MainTex_TexelSize.xy * half2(0.0, 1.0) * _Parameter.x; |
||
134 | half4 coords = -netFilterWidth.xyxy * 3.0; |
||
135 | |||
136 | o.offs[0] = v.texcoord.xyxy + coords * half4(1.0h,1.0h,-1.0h,-1.0h); |
||
137 | coords += netFilterWidth.xyxy; |
||
138 | o.offs[1] = v.texcoord.xyxy + coords * half4(1.0h,1.0h,-1.0h,-1.0h); |
||
139 | coords += netFilterWidth.xyxy; |
||
140 | o.offs[2] = v.texcoord.xyxy + coords * half4(1.0h,1.0h,-1.0h,-1.0h); |
||
141 | |||
142 | return o; |
||
143 | } |
||
144 | |||
145 | half4 fragBlurSGX ( v2f_withBlurCoordsSGX i ) : SV_Target |
||
146 | { |
||
147 | half2 uv = i.uv.xy; |
||
148 | |||
149 | half4 color = tex2D(_MainTex, i.uv) * curve4[3]; |
||
150 | |||
151 | for( int l = 0; l < 3; l++ ) |
||
152 | { |
||
153 | half4 tapA = tex2D(_MainTex, i.offs[l].xy); |
||
154 | half4 tapB = tex2D(_MainTex, i.offs[l].zw); |
||
155 | color += (tapA + tapB) * curve4[l]; |
||
156 | } |
||
157 | |||
158 | return color; |
||
159 | |||
160 | } |
||
161 | |||
162 | ENDCG |
||
163 | |||
164 | SubShader { |
||
165 | ZTest Off Cull Off ZWrite Off Blend Off |
||
166 | |||
167 | // 0 |
||
168 | Pass { |
||
169 | |||
170 | CGPROGRAM |
||
171 | |||
172 | #pragma vertex vert4Tap |
||
173 | #pragma fragment fragDownsample |
||
174 | |||
175 | ENDCG |
||
176 | |||
177 | } |
||
178 | |||
179 | // 1 |
||
180 | Pass { |
||
181 | ZTest Always |
||
182 | Cull Off |
||
183 | |||
184 | CGPROGRAM |
||
185 | |||
186 | #pragma vertex vertBlurVertical |
||
187 | #pragma fragment fragBlur8 |
||
188 | |||
189 | ENDCG |
||
190 | } |
||
191 | |||
192 | // 2 |
||
193 | Pass { |
||
194 | ZTest Always |
||
195 | Cull Off |
||
196 | |||
197 | CGPROGRAM |
||
198 | |||
199 | #pragma vertex vertBlurHorizontal |
||
200 | #pragma fragment fragBlur8 |
||
201 | |||
202 | ENDCG |
||
203 | } |
||
204 | |||
205 | // alternate blur |
||
206 | // 3 |
||
207 | Pass { |
||
208 | ZTest Always |
||
209 | Cull Off |
||
210 | |||
211 | CGPROGRAM |
||
212 | |||
213 | #pragma vertex vertBlurVerticalSGX |
||
214 | #pragma fragment fragBlurSGX |
||
215 | |||
216 | ENDCG |
||
217 | } |
||
218 | |||
219 | // 4 |
||
220 | Pass { |
||
221 | ZTest Always |
||
222 | Cull Off |
||
223 | |||
224 | CGPROGRAM |
||
225 | |||
226 | #pragma vertex vertBlurHorizontalSGX |
||
227 | #pragma fragment fragBlurSGX |
||
228 | |||
229 | ENDCG |
||
230 | } |
||
231 | } |
||
232 | |||
233 | FallBack Off |
||
234 | } |