FocusShader.js 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. /**
  2. * @module FocusShader
  3. * @three_import import { FocusShader } from 'three/addons/shaders/FocusShader.js';
  4. */
  5. /**
  6. * Focus shader based on [PaintEffect postprocess from ro.me]{@link http://code.google.com/p/3-dreams-of-black/source/browse/deploy/js/effects/PaintEffect.js}.
  7. *
  8. * @constant
  9. * @type {ShaderMaterial~Shader}
  10. */
  11. const FocusShader = {
  12. name: 'FocusShader',
  13. uniforms: {
  14. 'tDiffuse': { value: null },
  15. 'screenWidth': { value: 1024 },
  16. 'screenHeight': { value: 1024 },
  17. 'sampleDistance': { value: 0.94 },
  18. 'waveFactor': { value: 0.00125 }
  19. },
  20. vertexShader: /* glsl */`
  21. varying vec2 vUv;
  22. void main() {
  23. vUv = uv;
  24. gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
  25. }`,
  26. fragmentShader: /* glsl */`
  27. uniform float screenWidth;
  28. uniform float screenHeight;
  29. uniform float sampleDistance;
  30. uniform float waveFactor;
  31. uniform sampler2D tDiffuse;
  32. varying vec2 vUv;
  33. void main() {
  34. vec4 color, org, tmp, add;
  35. float sample_dist, f;
  36. vec2 vin;
  37. vec2 uv = vUv;
  38. add = color = org = texture2D( tDiffuse, uv );
  39. vin = ( uv - vec2( 0.5 ) ) * vec2( 1.4 );
  40. sample_dist = dot( vin, vin ) * 2.0;
  41. f = ( waveFactor * 100.0 + sample_dist ) * sampleDistance * 4.0;
  42. vec2 sampleSize = vec2( 1.0 / screenWidth, 1.0 / screenHeight ) * vec2( f );
  43. add += tmp = texture2D( tDiffuse, uv + vec2( 0.111964, 0.993712 ) * sampleSize );
  44. if( tmp.b < color.b ) color = tmp;
  45. add += tmp = texture2D( tDiffuse, uv + vec2( 0.846724, 0.532032 ) * sampleSize );
  46. if( tmp.b < color.b ) color = tmp;
  47. add += tmp = texture2D( tDiffuse, uv + vec2( 0.943883, -0.330279 ) * sampleSize );
  48. if( tmp.b < color.b ) color = tmp;
  49. add += tmp = texture2D( tDiffuse, uv + vec2( 0.330279, -0.943883 ) * sampleSize );
  50. if( tmp.b < color.b ) color = tmp;
  51. add += tmp = texture2D( tDiffuse, uv + vec2( -0.532032, -0.846724 ) * sampleSize );
  52. if( tmp.b < color.b ) color = tmp;
  53. add += tmp = texture2D( tDiffuse, uv + vec2( -0.993712, -0.111964 ) * sampleSize );
  54. if( tmp.b < color.b ) color = tmp;
  55. add += tmp = texture2D( tDiffuse, uv + vec2( -0.707107, 0.707107 ) * sampleSize );
  56. if( tmp.b < color.b ) color = tmp;
  57. color = color * vec4( 2.0 ) - ( add / vec4( 8.0 ) );
  58. color = color + ( add / vec4( 8.0 ) - color ) * ( vec4( 1.0 ) - vec4( sample_dist * 0.5 ) );
  59. gl_FragColor = vec4( color.rgb * color.rgb * vec3( 0.95 ) + color.rgb, 1.0 );
  60. }`
  61. };
  62. export { FocusShader };