2
0

VelocityShader.js 2.9 KB

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