VelocityShader.js 2.9 KB

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