fxaa.glsl 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. extern vec2 stepsize;
  2. vec4 effect(vec4 color, Image texture, vec2 texture_coords, vec2 screen_coords) {
  3. float FXAA_SPAN_MAX = 8.0;
  4. float FXAA_REDUCE_MUL = 1.0 / 8.0;
  5. float FXAA_REDUCE_MIN = (1.0 / 128.0);
  6. vec3 rgbNW = Texel(texture, texture_coords + (vec2(-1.0, -1.0) * stepsize)).rgb;
  7. vec3 rgbNE = Texel(texture, texture_coords + (vec2(1.0, -1.0) * stepsize)).rgb;
  8. vec3 rgbSW = Texel(texture, texture_coords + (vec2(-1.0, 1.0) * stepsize)).rgb;
  9. vec3 rgbSE = Texel(texture, texture_coords + (vec2(1.0, 1.0) * stepsize)).rgb;
  10. vec3 rgbM = Texel(texture, texture_coords).rgb;
  11. vec3 lum = vec3(.299, .587, .114);
  12. float lumNW = dot(rgbNW, lum);
  13. float lumNE = dot(rgbNE, lum);
  14. float lumSW = dot(rgbSW, lum);
  15. float lumSE = dot(rgbSE, lum);
  16. float lumM = dot(rgbM, lum);
  17. float lumMin = min(lumM, min(min(lumNW, lumNE), min(lumSW, lumSE)));
  18. float lumMax = max(lumM, max(max(lumNW, lumNE), max(lumSW, lumSE)));
  19. vec2 dir;
  20. dir.x = -((lumNW + lumNE) - (lumSW + lumSE));
  21. dir.y = ((lumNW + lumNE) - (lumSW + lumSE));
  22. float dirReduce = max((lumNW + lumNE + lumSW + lumSE) * (.25 * FXAA_REDUCE_MUL), FXAA_REDUCE_MIN);
  23. float rcpDirMin = 1.0 / (min(abs(dir.x), abs(dir.y)) + dirReduce);
  24. dir = min(vec2(FXAA_SPAN_MAX, FXAA_SPAN_MAX), max(vec2(-FXAA_SPAN_MAX, -FXAA_SPAN_MAX), dir * rcpDirMin)) * stepsize;
  25. vec3 rgbA = 0.5 * (Texel(texture, texture_coords + dir * (1.0 / 3.0 - 0.5)).rgb + Texel(texture, texture_coords + dir * (2.0 / 3.0 - 0.5)).rgb);
  26. vec3 rgbB = rgbA * 0.5 + 0.25 * (Texel(texture, texture_coords + dir * (0.0 / 3.0 - 0.5)).rgb + Texel(texture, texture_coords + dir * (3.0 / 3.0 - 0.5)).rgb);
  27. float lumB = dot(rgbB, lum);
  28. if(lumB < lumMin || lumB > lumMax) {
  29. return vec4(rgbA, 1.0) * color;
  30. }
  31. else {
  32. return vec4(rgbB, 1.0) * color;
  33. }
  34. }