1
2
3 /*============================================================================
4
5 source taken
from
6
7
8                     NVIDIA FXAA
3.11 by TIMOTHY LOTTES
9
10                                         
11 and adapted and ported to Unity
by Unity Technologies
12
13                     
14 ------------------------------------------------------------------------------
15 COPYRIGHT (C)
2010, 2011 NVIDIA CORPORATION. ALL RIGHTS RESERVED.
16 ------------------------------------------------------------------------------
17 TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, THIS SOFTWARE IS PROVIDED
18 *AS IS* AND NVIDIA AND ITS SUPPLIERS DISCLAIM ALL WARRANTIES, EITHER EXPRESS
19 OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
20 MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL NVIDIA
21 OR ITS SUPPLIERS BE LIABLE FOR ANY SPECIAL, INCIDENTAL, INDIRECT, OR
22 CONSEQUENTIAL DAMAGES WHATSOEVER (INCLUDING, WITHOUT LIMITATION, DAMAGES FOR
23 LOSS OF BUSINESS PROFITS, BUSINESS INTERRUPTION, LOSS OF BUSINESS INFORMATION,
24 OR ANY OTHER PECUNIARY LOSS) ARISING OUT OF THE USE OF OR INABILITY TO USE
25 THIS SOFTWARE, EVEN IF NVIDIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
26 DAMAGES.
27
28 ============================================================================*/

29
30
31 Shader
"Hidden/FXAA III (Console)" {
32     Properties {
33         _MainTex (
"-", 2D) = "white" {}
34         _EdgeThresholdMin (
"Edge threshold min",float) = 0.125
35         _EdgeThreshold(
"Edge Threshold", float) = 0.25
36         _EdgeSharpness(
"Edge sharpness",float) = 4.0
37     }
38     SubShader {
39         Pass {
40             ZTest Always Cull Off ZWrite Off
41         
42         CGPROGRAM
43         #pragma vertex vert
44         #pragma fragment frag
45         #pragma target
3.0
46         
47         #include
"UnityCG.cginc"
48
49         uniform sampler2D _MainTex;
50         uniform half _EdgeThresholdMin;
51         uniform half _EdgeThreshold;
52         uniform half _EdgeSharpness;
53
54         
struct v2f {
55             float4 pos : SV_POSITION;
56             float2 uv : TEXCOORD0;
57             float4 interpolatorA : TEXCOORD1;
58             float4 interpolatorB : TEXCOORD2;
59             float4 interpolatorC : TEXCOORD3;
60         };
61         
62         float4 _MainTex_TexelSize;
63         
64         v2f vert (appdata_img v)
65         {
66             v2f o;
67             o.pos = mul (UNITY_MATRIX_MVP, v.vertex);
68             
69             o.uv = v.texcoord.xy;
70             
71             float4 extents;
72             float2 offset = ( _MainTex_TexelSize.xy ) *
0.5f;
73             extents.xy = v.texcoord.xy - offset;
74             extents.zw = v.texcoord.xy + offset;
75
76             float4 rcpSize;
77             rcpSize.xy = -_MainTex_TexelSize.xy *
0.5f;
78             rcpSize.zw = _MainTex_TexelSize.xy *
0.5f;
79 #
if defined (SHADER_API_PSP2)
80             
//cg compiler linker bug workaround
81             
float almostzero = v.texcoord.x*0.000001f;
82             rcpSize.x += almostzero;
83 #endif
84             o.interpolatorA = extents;
85             o.interpolatorB = rcpSize;
86             o.interpolatorC = rcpSize;
87             
88             o.interpolatorC.xy *=
4.0;
89             o.interpolatorC.zw *=
4.0;
90             
91             
return o;
92         }

93
94 // hacky support
for NaCl
95 #
if defined(SHADER_API_GLES) && defined(SHADER_API_DESKTOP)
96         #define FxaaTexTop(t, p) tex2D(t, p)
97 #
else
98         #define FxaaTexTop(t, p) tex2Dlod(t, float4(p,
0.0, 0.0))
99 #endif
100
101         inline half TexLuminance( float2 uv )
102         {
103             
return Luminance(FxaaTexTop(_MainTex, uv).rgb);
104         }
105
106         half3 FxaaPixelShader(float2 pos, float4 extents, float4 rcpSize, float4 rcpSize2)
107         {
108             half lumaNw = TexLuminance(extents.xy);
109             half lumaSw = TexLuminance(extents.xw);
110             half lumaNe = TexLuminance(extents.zy);
111             half lumaSe = TexLuminance(extents.zw);
112             
113             half3 centre = FxaaTexTop(_MainTex, pos).rgb;
114             half lumaCentre = Luminance(centre);
115             
116             half lumaMaxNwSw = max( lumaNw , lumaSw );
117             lumaNe +=
1.0/384.0;
118             half lumaMinNwSw = min( lumaNw , lumaSw );
119             
120             half lumaMaxNeSe = max( lumaNe , lumaSe );
121             half lumaMinNeSe = min( lumaNe , lumaSe );
122             
123             half lumaMax = max( lumaMaxNeSe, lumaMaxNwSw );
124             half lumaMin = min( lumaMinNeSe, lumaMinNwSw );
125             
126             half lumaMaxScaled = lumaMax * _EdgeThreshold;
127             
128             half lumaMinCentre = min( lumaMin , lumaCentre );
129             half lumaMaxScaledClamped = max( _EdgeThresholdMin , lumaMaxScaled );
130             half lumaMaxCentre = max( lumaMax , lumaCentre );
131             half dirSWMinusNE = lumaSw - lumaNe;
132             half lumaMaxCMinusMinC = lumaMaxCentre - lumaMinCentre;
133             half dirSEMinusNW = lumaSe - lumaNw;
134             
135             
if(lumaMaxCMinusMinC < lumaMaxScaledClamped)
136                 
return centre;
137             
138             half2 dir;
139             dir.x = dirSWMinusNE + dirSEMinusNW;
140             dir.y = dirSWMinusNE - dirSEMinusNW;
141             
142             dir = normalize(dir);
143             half3 col1 = FxaaTexTop(_MainTex, pos.xy - dir * rcpSize.zw).rgb;
144             half3 col2 = FxaaTexTop(_MainTex, pos.xy + dir * rcpSize.zw).rgb;
145             
146             half dirAbsMinTimesC = min( abs( dir.x ) , abs( dir.y ) ) * _EdgeSharpness;
147             dir = clamp(dir.xy/dirAbsMinTimesC, -
2.0, 2.0);
148             
149             half3 col3 = FxaaTexTop(_MainTex, pos.xy - dir * rcpSize2.zw).rgb;
150             half3 col4 = FxaaTexTop(_MainTex, pos.xy + dir * rcpSize2.zw).rgb;
151             
152             half3 rgbyA = col1 + col2;
153             half3 rgbyB = ((col3 + col4) *
0.25) + (rgbyA * 0.25);
154             
155             
if((Luminance(rgbyA) < lumaMin) || (Luminance(rgbyB) > lumaMax))
156                 
return rgbyA * 0.5;
157             
else
158                 
return rgbyB;
159         }
160
161         half4 frag (v2f i) : SV_Target
162         {
163             half3 color = FxaaPixelShader(i.uv, i.interpolatorA, i.interpolatorB, i.interpolatorC);
164             
return half4(color, 1.0);
165         }
166         
167         ENDCG
168         }
169     }
170     FallBack Off
171 }


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