fxaa.fs 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. #version 300 es
  2. precision highp float;
  3. in vec2 fragTexCoord;
  4. uniform sampler2D inputTexture;
  5. uniform vec2 invTextureResolution;
  6. out vec4 finalColor;
  7. void main()
  8. {
  9. const float spanMax = 4.0;
  10. const float reduceAmount = 1.0 / 4.0;
  11. const float reduceMin = (1.0 / 64.0);
  12. vec3 luma = vec3(0.299, 0.587, 0.114);
  13. float lumaNW = dot(texture(inputTexture, fragTexCoord + (vec2(-1.0, -1.0) * invTextureResolution)).rgb, luma);
  14. float lumaNE = dot(texture(inputTexture, fragTexCoord + (vec2( 1.0, -1.0) * invTextureResolution)).rgb, luma);
  15. float lumaSW = dot(texture(inputTexture, fragTexCoord + (vec2(-1.0, 1.0) * invTextureResolution)).rgb, luma);
  16. float lumaSE = dot(texture(inputTexture, fragTexCoord + (vec2( 1.0, 1.0) * invTextureResolution)).rgb, luma);
  17. float lumaMI = dot(texture(inputTexture, fragTexCoord).rgb, luma);
  18. float lumaMin = min(lumaMI, min(min(lumaNW, lumaNE), min(lumaSW, lumaSE)));
  19. float lumaMax = max(lumaMI, max(max(lumaNW, lumaNE), max(lumaSW, lumaSE)));
  20. vec2 dir = vec2(
  21. -((lumaNW + lumaNE) - (lumaSW + lumaSE)),
  22. +((lumaNW + lumaSW) - (lumaNE + lumaSE)));
  23. float dirReduce = max((lumaNW + lumaNE + lumaSW + lumaSE) * (0.25 * reduceAmount), reduceMin);
  24. float dirRcpMin = 1.0/(min(abs(dir.x), abs(dir.y)) + dirReduce);
  25. dir = min(vec2(spanMax, spanMax), max(vec2(-spanMax, -spanMax), dir * dirRcpMin)) * invTextureResolution;
  26. vec3 rgba0 = texture(inputTexture, fragTexCoord + dir * (1.0 / 3.0 - 0.5)).rgb;
  27. vec3 rgba1 = texture(inputTexture, fragTexCoord + dir * (2.0 / 3.0 - 0.5)).rgb;
  28. vec3 rgba2 = texture(inputTexture, fragTexCoord + dir * (0.0 / 3.0 - 0.5)).rgb;
  29. vec3 rgba3 = texture(inputTexture, fragTexCoord + dir * (3.0 / 3.0 - 0.5)).rgb;
  30. vec3 rgbA = (1.0/ 2.0) * (rgba0 + rgba1);
  31. vec3 rgbB = rgbA * (1.0/ 2.0) + (1.0/ 4.0) * (rgba2 + rgba3);
  32. float lumaB = dot(rgbB, luma);
  33. finalColor.rgb = (lumaB < lumaMin) || (lumaB > lumaMax) ? rgbA : rgbB;
  34. }