프로젝트

일반

사용자정보

통계
| 개정판:

t1 / TFDContents / Assets / Resources / BlurShader4.shader @ 10

이력 | 보기 | 이력해설 | 다운로드 (4.91 KB)

1
// 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
}