antialiasing.glslf 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. #version GLSL_VERSION
  2. /*==============================================================================
  3. VARS
  4. ==============================================================================*/
  5. #var AA_METHOD AA_METHOD_FXAA_LIGHT
  6. #var AA_QUALITY AA_QUALITY_LOW
  7. /*============================================================================*/
  8. #include <precision_statement.glslf>
  9. #include <std.glsl>
  10. #include <color_util.glslf>
  11. uniform sampler2D u_color;
  12. uniform vec2 u_texel_size;
  13. /*==============================================================================
  14. SHADER INTERFACE
  15. ==============================================================================*/
  16. GLSL_IN vec2 v_texcoord;
  17. //------------------------------------------------------------------------------
  18. GLSL_OUT vec4 GLSL_OUT_FRAG_COLOR;
  19. /*============================================================================*/
  20. #if AA_METHOD == AA_METHOD_FXAA_LIGHT
  21. # define FXAA_REDUCE_MIN (1.0/128.0)
  22. # define FXAA_REDUCE_MUL (1.0/8.0)
  23. # define FXAA_SPAN_MAX 8.0
  24. vec4 get(float x, float y) {
  25. vec2 coord = v_texcoord + vec2(x,y) * u_texel_size;
  26. return GLSL_TEXTURE(u_color, coord);
  27. }
  28. vec4 fxaa_light() {
  29. vec4 rgbNW = get(-1.0,-1.0);
  30. vec4 rgbNE = get( 1.0,-1.0);
  31. vec4 rgbSW = get(-1.0, 1.0);
  32. vec4 rgbSE = get( 1.0, 1.0);
  33. vec4 rgbM = get( 0.0, 0.0);
  34. float lumaM = luma(rgbM);
  35. float lumaNW = luma(rgbNW);
  36. float lumaNE = luma(rgbNE);
  37. float lumaSW = luma(rgbSW);
  38. float lumaSE = luma(rgbSE);
  39. float lumaMin = min(lumaM, min(min(lumaNW, lumaNE), min(lumaSW, lumaSE)));
  40. float lumaMax = max(lumaM, max(max(lumaNW, lumaNE), max(lumaSW, lumaSE)));
  41. vec2 dir;
  42. dir.x = -((lumaNW + lumaNE) - (lumaSW + lumaSE));
  43. dir.y = ((lumaNW + lumaSW) - (lumaNE + lumaSE));
  44. float dirReduce = max((lumaNW + lumaNE + lumaSW + lumaSE) *
  45. (0.25 * FXAA_REDUCE_MUL), FXAA_REDUCE_MIN);
  46. float rcpDirMin = 1.0/(min(abs(dir.x), abs(dir.y)) + dirReduce);
  47. dir = min(vec2(FXAA_SPAN_MAX, FXAA_SPAN_MAX),
  48. max(vec2(-FXAA_SPAN_MAX, -FXAA_SPAN_MAX), dir * rcpDirMin)) * u_texel_size;
  49. vec4 rgbA = 0.5 * (
  50. GLSL_TEXTURE(u_color, v_texcoord + dir * (1.0/3.0 - 0.5)) +
  51. GLSL_TEXTURE(u_color, v_texcoord + dir * (2.0/3.0 - 0.5)));
  52. vec4 rgbB = rgbA * 0.5 + 0.25 * (
  53. GLSL_TEXTURE(u_color, v_texcoord + dir * -0.5) +
  54. GLSL_TEXTURE(u_color, v_texcoord + dir * 0.5));
  55. float lumaB = luma(rgbB);
  56. if ((lumaB < lumaMin) || (lumaB > lumaMax))
  57. return rgbA;
  58. else
  59. return rgbB;
  60. }
  61. #elif AA_METHOD == AA_METHOD_FXAA_QUALITY
  62. # define FXAA_GREEN_AS_LUMA 1
  63. # include <fxaa.glslf>
  64. # if AA_QUALITY == AA_QUALITY_HIGH
  65. # define FXAA_QUALITY_PRESET 39
  66. # define FXAA_QUALITY_SUBPIX 1.00
  67. # define FXAA_QUALITY_EDGE_THRESHOLD 0.063
  68. # define FXAA_QUALITY_EDGE_THRESHOLD_MIN 0.0312
  69. # elif AA_QUALITY == AA_QUALITY_MEDIUM
  70. # define FXAA_QUALITY_PRESET 20
  71. # define FXAA_QUALITY_SUBPIX 0.65
  72. # define FXAA_QUALITY_EDGE_THRESHOLD 0.166
  73. # define FXAA_QUALITY_EDGE_THRESHOLD_MIN 0.0625
  74. # elif AA_QUALITY == AA_QUALITY_LOW
  75. # define FXAA_QUALITY_PRESET 12
  76. # define FXAA_QUALITY_SUBPIX 0.50
  77. # define FXAA_QUALITY_EDGE_THRESHOLD 0.166
  78. # define FXAA_QUALITY_EDGE_THRESHOLD_MIN 0.0833
  79. # endif // AA_QUALITY
  80. #endif // AA_METHOD
  81. /*==============================================================================
  82. MAIN
  83. ==============================================================================*/
  84. void main(void) {
  85. #if AA_METHOD == AA_METHOD_FXAA_LIGHT
  86. GLSL_OUT_FRAG_COLOR = fxaa_light();
  87. #elif AA_METHOD == AA_METHOD_FXAA_QUALITY
  88. // NOTE: iPad hack
  89. vec2 vec2_tmp = u_texel_size;
  90. GLSL_OUT_FRAG_COLOR = FxaaPixelShader(
  91. v_texcoord,
  92. u_color,
  93. vec2_tmp,
  94. FXAA_QUALITY_SUBPIX,
  95. FXAA_QUALITY_EDGE_THRESHOLD,
  96. FXAA_QUALITY_EDGE_THRESHOLD_MIN);
  97. #endif
  98. }