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 }