FXAA3Console.shader 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. // Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
  2. /*============================================================================
  3. source taken from
  4. NVIDIA FXAA 3.11 by TIMOTHY LOTTES
  5. and adapted and ported to Unity by Unity Technologies
  6. ------------------------------------------------------------------------------
  7. COPYRIGHT (C) 2010, 2011 NVIDIA CORPORATION. ALL RIGHTS RESERVED.
  8. ------------------------------------------------------------------------------
  9. TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, THIS SOFTWARE IS PROVIDED
  10. *AS IS* AND NVIDIA AND ITS SUPPLIERS DISCLAIM ALL WARRANTIES, EITHER EXPRESS
  11. OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
  12. MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL NVIDIA
  13. OR ITS SUPPLIERS BE LIABLE FOR ANY SPECIAL, INCIDENTAL, INDIRECT, OR
  14. CONSEQUENTIAL DAMAGES WHATSOEVER (INCLUDING, WITHOUT LIMITATION, DAMAGES FOR
  15. LOSS OF BUSINESS PROFITS, BUSINESS INTERRUPTION, LOSS OF BUSINESS INFORMATION,
  16. OR ANY OTHER PECUNIARY LOSS) ARISING OUT OF THE USE OF OR INABILITY TO USE
  17. THIS SOFTWARE, EVEN IF NVIDIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
  18. DAMAGES.
  19. ============================================================================*/
  20. Shader "Hidden/FXAA III (Console)" {
  21. Properties {
  22. _MainTex ("-", 2D) = "white" {}
  23. _EdgeThresholdMin ("Edge threshold min",float) = 0.125
  24. _EdgeThreshold("Edge Threshold", float) = 0.25
  25. _EdgeSharpness("Edge sharpness",float) = 4.0
  26. }
  27. SubShader {
  28. Pass {
  29. ZTest Always Cull Off ZWrite Off
  30. CGPROGRAM
  31. #pragma vertex vert
  32. #pragma fragment frag
  33. #pragma target 3.0
  34. #include "UnityCG.cginc"
  35. uniform sampler2D _MainTex;
  36. uniform half _EdgeThresholdMin;
  37. uniform half _EdgeThreshold;
  38. uniform half _EdgeSharpness;
  39. struct v2f {
  40. float4 pos : SV_POSITION;
  41. float2 uv : TEXCOORD0;
  42. float4 interpolatorA : TEXCOORD1;
  43. float4 interpolatorB : TEXCOORD2;
  44. float4 interpolatorC : TEXCOORD3;
  45. };
  46. float4 _MainTex_TexelSize;
  47. v2f vert (appdata_img v)
  48. {
  49. v2f o;
  50. o.pos = UnityObjectToClipPos (v.vertex);
  51. o.uv = v.texcoord.xy;
  52. float4 extents;
  53. float2 offset = ( _MainTex_TexelSize.xy ) * 0.5f;
  54. extents.xy = v.texcoord.xy - offset;
  55. extents.zw = v.texcoord.xy + offset;
  56. float4 rcpSize;
  57. rcpSize.xy = -_MainTex_TexelSize.xy * 0.5f;
  58. rcpSize.zw = _MainTex_TexelSize.xy * 0.5f;
  59. #if defined (SHADER_API_PSP2)
  60. //cg compiler linker bug workaround
  61. float almostzero = v.texcoord.x*0.000001f;
  62. rcpSize.x += almostzero;
  63. #endif
  64. o.interpolatorA = extents;
  65. o.interpolatorB = rcpSize;
  66. o.interpolatorC = rcpSize;
  67. o.interpolatorC.xy *= 4.0;
  68. o.interpolatorC.zw *= 4.0;
  69. return o;
  70. }
  71. // hacky support for NaCl
  72. #if defined(SHADER_API_GLES) && defined(SHADER_API_DESKTOP)
  73. #define FxaaTexTop(t, p) tex2D(t, p)
  74. #else
  75. #define FxaaTexTop(t, p) tex2Dlod(t, float4(p, 0.0, 0.0))
  76. #endif
  77. inline half TexLuminance( float2 uv )
  78. {
  79. return Luminance(FxaaTexTop(_MainTex, uv).rgb);
  80. }
  81. half3 FxaaPixelShader(float2 pos, float4 extents, float4 rcpSize, float4 rcpSize2)
  82. {
  83. half lumaNw = TexLuminance(extents.xy);
  84. half lumaSw = TexLuminance(extents.xw);
  85. half lumaNe = TexLuminance(extents.zy);
  86. half lumaSe = TexLuminance(extents.zw);
  87. half3 centre = FxaaTexTop(_MainTex, pos).rgb;
  88. half lumaCentre = Luminance(centre);
  89. half lumaMaxNwSw = max( lumaNw , lumaSw );
  90. lumaNe += 1.0/384.0;
  91. half lumaMinNwSw = min( lumaNw , lumaSw );
  92. half lumaMaxNeSe = max( lumaNe , lumaSe );
  93. half lumaMinNeSe = min( lumaNe , lumaSe );
  94. half lumaMax = max( lumaMaxNeSe, lumaMaxNwSw );
  95. half lumaMin = min( lumaMinNeSe, lumaMinNwSw );
  96. half lumaMaxScaled = lumaMax * _EdgeThreshold;
  97. half lumaMinCentre = min( lumaMin , lumaCentre );
  98. half lumaMaxScaledClamped = max( _EdgeThresholdMin , lumaMaxScaled );
  99. half lumaMaxCentre = max( lumaMax , lumaCentre );
  100. half dirSWMinusNE = lumaSw - lumaNe;
  101. half lumaMaxCMinusMinC = lumaMaxCentre - lumaMinCentre;
  102. half dirSEMinusNW = lumaSe - lumaNw;
  103. if(lumaMaxCMinusMinC < lumaMaxScaledClamped)
  104. return centre;
  105. half2 dir;
  106. dir.x = dirSWMinusNE + dirSEMinusNW;
  107. dir.y = dirSWMinusNE - dirSEMinusNW;
  108. dir = normalize(dir);
  109. half3 col1 = FxaaTexTop(_MainTex, pos.xy - dir * rcpSize.zw).rgb;
  110. half3 col2 = FxaaTexTop(_MainTex, pos.xy + dir * rcpSize.zw).rgb;
  111. half dirAbsMinTimesC = min( abs( dir.x ) , abs( dir.y ) ) * _EdgeSharpness;
  112. dir = clamp(dir.xy/dirAbsMinTimesC, -2.0, 2.0);
  113. half3 col3 = FxaaTexTop(_MainTex, pos.xy - dir * rcpSize2.zw).rgb;
  114. half3 col4 = FxaaTexTop(_MainTex, pos.xy + dir * rcpSize2.zw).rgb;
  115. half3 rgbyA = col1 + col2;
  116. half3 rgbyB = ((col3 + col4) * 0.25) + (rgbyA * 0.25);
  117. if((Luminance(rgbyA) < lumaMin) || (Luminance(rgbyB) > lumaMax))
  118. return rgbyA * 0.5;
  119. else
  120. return rgbyB;
  121. }
  122. half4 frag (v2f i) : SV_Target
  123. {
  124. half3 color = FxaaPixelShader(i.uv, i.interpolatorA, i.interpolatorB, i.interpolatorC);
  125. return half4(color, 1.0);
  126. }
  127. ENDCG
  128. }
  129. }
  130. FallBack Off
  131. }