VelocityShader.js 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. import {
  2. UniformsLib,
  3. UniformsUtils,
  4. Matrix4
  5. } from 'three';
  6. /**
  7. * @module VelocityShader
  8. * @three_import import { VelocityShader } from 'three/addons/shaders/VelocityShader.js';
  9. */
  10. /**
  11. * Mesh velocity shader by @bhouston.
  12. *
  13. * @constant
  14. * @type {ShaderMaterial~Shader}
  15. */
  16. const VelocityShader = {
  17. name: 'VelocityShader',
  18. uniforms: UniformsUtils.merge( [
  19. UniformsLib.common,
  20. UniformsLib.displacementmap,
  21. {
  22. modelMatrixPrev: { value: new Matrix4() },
  23. currentProjectionViewMatrix: { value: new Matrix4() },
  24. previousProjectionViewMatrix: { value: new Matrix4() }
  25. }
  26. ] ),
  27. vertexShader: /* glsl */`
  28. #define NORMAL
  29. #if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP_TANGENTSPACE )
  30. varying vec3 vViewPosition;
  31. #endif
  32. #include <common>
  33. #include <packing>
  34. #include <uv_pars_vertex>
  35. #include <displacementmap_pars_vertex>
  36. #include <normal_pars_vertex>
  37. #include <morphtarget_pars_vertex>
  38. #include <skinning_pars_vertex>
  39. #include <logdepthbuf_pars_vertex>
  40. #include <clipping_planes_pars_vertex>
  41. uniform mat4 previousProjectionViewMatrix;
  42. uniform mat4 currentProjectionViewMatrix;
  43. uniform mat4 modelMatrixPrev;
  44. varying vec4 clipPositionCurrent;
  45. varying vec4 clipPositionPrevious;
  46. void main() {
  47. #include <uv_vertex>
  48. #include <beginnormal_vertex>
  49. #include <morphnormal_vertex>
  50. #include <skinbase_vertex>
  51. #include <skinnormal_vertex>
  52. #include <defaultnormal_vertex>
  53. #include <normal_vertex>
  54. #include <begin_vertex>
  55. #include <morphtarget_vertex>
  56. #include <displacementmap_vertex>
  57. #include <morphtarget_vertex>
  58. #include <skinning_vertex>
  59. #ifdef USE_SKINNING
  60. vec4 mvPosition = modelViewMatrix * skinned;
  61. clipPositionCurrent = currentProjectionViewMatrix * modelMatrix * skinned;
  62. clipPositionPrevious = previousProjectionViewMatrix * modelMatrixPrev * skinned;
  63. #else
  64. vec4 mvPosition = modelViewMatrix * vec4( transformed, 1.0 );
  65. clipPositionCurrent = currentProjectionViewMatrix * modelMatrix * vec4( transformed, 1.0 );
  66. clipPositionPrevious = previousProjectionViewMatrix * modelMatrixPrev * vec4( transformed, 1.0 );
  67. #endif
  68. gl_Position = projectionMatrix * mvPosition;
  69. #include <logdepthbuf_vertex>
  70. #include <clipping_planes_vertex>
  71. }
  72. `,
  73. fragmentShader: /* glsl */`
  74. #define NORMAL
  75. uniform float opacity;
  76. #include <packing>
  77. #include <uv_pars_fragment>
  78. #include <map_pars_fragment>
  79. #include <alphamap_pars_fragment>
  80. #include <alphatest_pars_fragment>
  81. #include <logdepthbuf_pars_fragment>
  82. #include <clipping_planes_pars_fragment>
  83. varying vec4 clipPositionCurrent;
  84. varying vec4 clipPositionPrevious;
  85. void main() {
  86. vec4 diffuseColor = vec4( 1.0 );
  87. diffuseColor.a = opacity;
  88. #include <map_fragment>
  89. #include <alphamap_fragment>
  90. #include <alphatest_fragment>
  91. vec2 ndcPositionCurrent = clipPositionCurrent.xy/clipPositionCurrent.w;
  92. vec2 ndcPositionPrevious = clipPositionPrevious.xy/clipPositionPrevious.w;
  93. vec2 vel = ( ndcPositionCurrent - ndcPositionPrevious ) * 0.5;
  94. vel = vel * 0.5 + 0.5;
  95. vec2 v1 = packDepthToRG(vel.x);
  96. vec2 v2 = packDepthToRG(vel.y);
  97. gl_FragColor = vec4(v1.x, v1.y, v2.x, v2.y);
  98. #include <logdepthbuf_fragment>
  99. }
  100. `
  101. };
  102. export { VelocityShader };