VelocityShader.js 3.0 KB

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