Blur.hx 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. package h3d.shader;
  2. class Blur extends ScreenShader {
  3. static var SRC = {
  4. @param var cameraInverseViewProj : Mat4;
  5. @param var texture : Sampler2D;
  6. @param var depthTexture : Sampler2D;
  7. @param @const var Quality : Int;
  8. @param @const var isDepth : Bool;
  9. @param var values : Array<Float,Quality>;
  10. @param var offsets : Array<Float,Quality>;
  11. @param var pixel : Vec2;
  12. @const var hasFixedColor : Bool;
  13. @const var smoothFixedColor : Bool;
  14. @param var fixedColor : Vec4;
  15. @param @const var isDepthDependant : Bool;
  16. @param @const var hasNormal : Bool;
  17. @param var normalTexture : Sampler2D;
  18. @param @const var isCube : Bool;
  19. @param var cubeTexture : SamplerCube;
  20. @param var cubeDir : Mat3;
  21. function fragment() {
  22. if( isDepthDependant ) {
  23. var pcur = getPosition(input.uv);
  24. var ccur = texture.get(input.uv);
  25. var color = vec4(0, 0, 0, 0);
  26. var ncur = unpackNormal(normalTexture.get(input.uv));
  27. @unroll for( i in -Quality + 1...Quality ) {
  28. var uv = input.uv + pixel * offsets[i < 0 ? -i : i];
  29. var c = texture.get(uv);
  30. var p = getPosition(uv);
  31. var d = (p - pcur).dot(p - pcur);
  32. var n = unpackNormal(normalTexture.get(uv));
  33. c = mix(ccur, c, ncur.dot(n));
  34. c = mix(c, ccur, ((d - 0.001).max(0.) * 100000).min(1.));
  35. color += c * values[i < 0 ? -i : i];
  36. }
  37. pixelColor = color;
  38. }
  39. else if( isDepth ) {
  40. var val = 0.;
  41. @unroll for( i in -Quality + 1...Quality ){
  42. if( isCube ) val += unpack(cubeTexture.get(vec3((input.uv + pixel * offsets[i < 0 ? -i : i] * i )* 2.0 - 1.0, 1) * cubeDir)) * values[i < 0 ? -i : i];
  43. else val += unpack(texture.get(input.uv + pixel * offsets[i < 0 ? -i : i] * i)) * values[i < 0 ? -i : i];
  44. }
  45. pixelColor = pack(val.min(0.9999999));
  46. } else {
  47. var color = vec4(0, 0, 0, 0);
  48. @unroll for( i in -Quality + 1...Quality ){
  49. if( isCube ) color += cubeTexture.get(vec3((input.uv + pixel * offsets[i < 0 ? -i : i] * i )* 2.0 - 1.0, 1) * cubeDir) * values[i < 0 ? -i : i];
  50. else color += texture.get(input.uv + pixel * offsets[i < 0 ? -i : i] * i) * values[i < 0 ? -i : i];
  51. }
  52. pixelColor = color;
  53. }
  54. if( hasFixedColor ) {
  55. if( smoothFixedColor )
  56. pixelColor.a *= fixedColor.a;
  57. else
  58. pixelColor.a = fixedColor.a * float(pixelColor.a > 0);
  59. pixelColor.rgb = fixedColor.rgb * pixelColor.a; // premult required for 2D filters
  60. }
  61. }
  62. function getPosition( uv : Vec2 ) : Vec3 {
  63. var depth = unpack(depthTexture.get(uv));
  64. var temp = vec4(uvToScreen(uv), depth, 1) * cameraInverseViewProj;
  65. var originWS = temp.xyz / temp.w;
  66. return originWS;
  67. }
  68. }
  69. }