Source: filters/blur/BlurXFilter.js

filters/blur/BlurXFilter.js

  1. import * as core from '../../core';
  2. import generateBlurVertSource from './generateBlurVertSource';
  3. import generateBlurFragSource from './generateBlurFragSource';
  4. import getMaxBlurKernelSize from './getMaxBlurKernelSize';
  5. /**
  6. * The BlurXFilter applies a horizontal Gaussian blur to an object.
  7. *
  8. * @class
  9. * @extends PIXI.Filter
  10. * @memberof PIXI.filters
  11. */
  12. export default class BlurXFilter extends core.Filter
  13. {
  14. /**
  15. * @param {number} strength - The strength of the blur filter.
  16. * @param {number} quality - The quality of the blur filter.
  17. * @param {number} resolution - The resolution of the blur filter.
  18. * @param {number} [kernelSize=5] - The kernelSize of the blur filter.Options: 5, 7, 9, 11, 13, 15.
  19. */
  20. constructor(strength, quality, resolution, kernelSize)
  21. {
  22. kernelSize = kernelSize || 5;
  23. const vertSrc = generateBlurVertSource(kernelSize, true);
  24. const fragSrc = generateBlurFragSource(kernelSize);
  25. super(
  26. // vertex shader
  27. vertSrc,
  28. // fragment shader
  29. fragSrc
  30. );
  31. this.resolution = resolution || core.settings.RESOLUTION;
  32. this._quality = 0;
  33. this.quality = quality || 4;
  34. this.strength = strength || 8;
  35. this.firstRun = true;
  36. }
  37. /**
  38. * Applies the filter.
  39. *
  40. * @param {PIXI.FilterManager} filterManager - The manager.
  41. * @param {PIXI.RenderTarget} input - The input target.
  42. * @param {PIXI.RenderTarget} output - The output target.
  43. * @param {boolean} clear - Should the output be cleared before rendering?
  44. */
  45. apply(filterManager, input, output, clear)
  46. {
  47. if (this.firstRun)
  48. {
  49. const gl = filterManager.renderer.gl;
  50. const kernelSize = getMaxBlurKernelSize(gl);
  51. this.vertexSrc = generateBlurVertSource(kernelSize, true);
  52. this.fragmentSrc = generateBlurFragSource(kernelSize);
  53. this.firstRun = false;
  54. }
  55. this.uniforms.strength = (1 / output.size.width) * (output.size.width / input.size.width);
  56. // screen space!
  57. this.uniforms.strength *= this.strength;
  58. this.uniforms.strength /= this.passes;// / this.passes//Math.pow(1, this.passes);
  59. if (this.passes === 1)
  60. {
  61. filterManager.applyFilter(this, input, output, clear);
  62. }
  63. else
  64. {
  65. const renderTarget = filterManager.getRenderTarget(true);
  66. let flip = input;
  67. let flop = renderTarget;
  68. for (let i = 0; i < this.passes - 1; i++)
  69. {
  70. filterManager.applyFilter(this, flip, flop, true);
  71. const temp = flop;
  72. flop = flip;
  73. flip = temp;
  74. }
  75. filterManager.applyFilter(this, flip, output, clear);
  76. filterManager.returnRenderTarget(renderTarget);
  77. }
  78. }
  79. /**
  80. * Sets the strength of both the blur.
  81. *
  82. * @member {number}
  83. * @default 16
  84. */
  85. get blur()
  86. {
  87. return this.strength;
  88. }
  89. set blur(value) // eslint-disable-line require-jsdoc
  90. {
  91. this.padding = Math.abs(value) * 2;
  92. this.strength = value;
  93. }
  94. /**
  95. * Sets the quality of the blur by modifying the number of passes. More passes means higher
  96. * quaility bluring but the lower the performance.
  97. *
  98. * @member {number}
  99. * @default 4
  100. */
  101. get quality()
  102. {
  103. return this._quality;
  104. }
  105. set quality(value) // eslint-disable-line require-jsdoc
  106. {
  107. this._quality = value;
  108. this.passes = value;
  109. }
  110. }