2
0

VelocityShader.js 2.9 KB

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