FXAA.hx 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. package h3d.pass;
  2. private class FXAAShader extends h3d.shader.ScreenShader {
  3. static var SRC = {
  4. @param var delta : Vec2;
  5. @param var texture : Sampler2D;
  6. function fragment() {
  7. var tuv = input.uv;
  8. var nw = texture.get(tuv + vec2(-1, -1) * delta).rgb;
  9. var ne = texture.get(tuv + vec2(1, -1) * delta).rgb;
  10. var sw = texture.get(tuv + vec2(-1, 1) * delta).rgb;
  11. var se = texture.get(tuv + vec2(1, 1) * delta).rgb;
  12. var origin = texture.get(tuv);
  13. var mid = origin.rgb;
  14. var lumA = vec3(0.299, 0.587, 0.114);
  15. var lumNW = nw.dot(lumA);
  16. var lumNE = ne.dot(lumA);
  17. var lumSW = sw.dot(lumA);
  18. var lumSE = se.dot(lumA);
  19. var lumMid = mid.dot(lumA);
  20. var lumMin = min(lumMid, min(min(lumNW, lumNE), min(lumSW, lumSE)));
  21. var lumMax = max(lumMid, max(max(lumNW, lumNE), max(lumSW, lumSE)));
  22. var dir : Vec2;
  23. dir.x = -((lumNW + lumNE) - (lumSW + lumSE));
  24. dir.y = ((lumNW + lumSW) - (lumNE + lumSE));
  25. var dirReduce = max((lumNW + lumNE + lumSW + lumSE) * (0.25 / 128), 1. / 8);
  26. var rcpDirMin = 1 / (min(abs(dir.x), abs(dir.y)) + dirReduce);
  27. dir = min(vec2(8, 8), max(vec2(-8, -8), dir * rcpDirMin)) * delta;
  28. var rgbA = 0.5 * (texture.get(tuv + dir * (1.0 / 3.0 - 0.5)).xyz + texture.get(tuv + dir * (2.0 / 3.0 - 0.5)).xyz);
  29. var rgbB = rgbA * 0.5 + 0.25 * (texture.get(tuv + dir * -0.5).xyz + texture.get(tuv + dir * 0.5).xyz);
  30. var lumB = dot(rgbB, lumA);
  31. var color : Vec4;
  32. var cmp = vec2(lumB, -lumB) > vec2(lumMin, -lumMax);
  33. color.xyz = mix(rgbA, rgbB, cmp.x * cmp.y);
  34. color.a = origin.a;
  35. output.color = color;
  36. }
  37. }
  38. }
  39. class FXAA extends ScreenFx<FXAAShader> {
  40. public function new() {
  41. super(new FXAAShader());
  42. }
  43. public function apply( texture : h3d.mat.Texture ) {
  44. shader.texture = texture;
  45. shader.delta.set(1 / texture.width, 1 / texture.height);
  46. render();
  47. }
  48. }