123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137 |
- import {
- UniformsLib,
- UniformsUtils,
- Matrix4
- } from 'three';
- /**
- * @module VelocityShader
- * @three_import import { VelocityShader } from 'three/addons/shaders/VelocityShader.js';
- */
- /**
- * Mesh velocity shader by @bhouston.
- *
- * @constant
- * @type {ShaderMaterial~Shader}
- */
- const VelocityShader = {
- name: 'VelocityShader',
- uniforms: UniformsUtils.merge( [
- UniformsLib.common,
- UniformsLib.displacementmap,
- {
- modelMatrixPrev: { value: new Matrix4() },
- currentProjectionViewMatrix: { value: new Matrix4() },
- previousProjectionViewMatrix: { value: new Matrix4() }
- }
- ] ),
- vertexShader: /* glsl */`
- #define NORMAL
- #if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP_TANGENTSPACE )
- varying vec3 vViewPosition;
- #endif
- #include <common>
- #include <packing>
- #include <uv_pars_vertex>
- #include <displacementmap_pars_vertex>
- #include <normal_pars_vertex>
- #include <morphtarget_pars_vertex>
- #include <skinning_pars_vertex>
- #include <logdepthbuf_pars_vertex>
- #include <clipping_planes_pars_vertex>
- uniform mat4 previousProjectionViewMatrix;
- uniform mat4 currentProjectionViewMatrix;
- uniform mat4 modelMatrixPrev;
- varying vec4 clipPositionCurrent;
- varying vec4 clipPositionPrevious;
- void main() {
- #include <uv_vertex>
- #include <beginnormal_vertex>
- #include <morphnormal_vertex>
- #include <skinbase_vertex>
- #include <skinnormal_vertex>
- #include <defaultnormal_vertex>
- #include <normal_vertex>
- #include <begin_vertex>
- #include <morphtarget_vertex>
- #include <displacementmap_vertex>
- #include <morphtarget_vertex>
- #include <skinning_vertex>
- #ifdef USE_SKINNING
- vec4 mvPosition = modelViewMatrix * skinned;
- clipPositionCurrent = currentProjectionViewMatrix * modelMatrix * skinned;
- clipPositionPrevious = previousProjectionViewMatrix * modelMatrixPrev * skinned;
- #else
- vec4 mvPosition = modelViewMatrix * vec4( transformed, 1.0 );
- clipPositionCurrent = currentProjectionViewMatrix * modelMatrix * vec4( transformed, 1.0 );
- clipPositionPrevious = previousProjectionViewMatrix * modelMatrixPrev * vec4( transformed, 1.0 );
- #endif
- gl_Position = projectionMatrix * mvPosition;
- #include <logdepthbuf_vertex>
- #include <clipping_planes_vertex>
- }
- `,
- fragmentShader: /* glsl */`
- #define NORMAL
- uniform float opacity;
- #include <packing>
- #include <uv_pars_fragment>
- #include <map_pars_fragment>
- #include <alphamap_pars_fragment>
- #include <alphatest_pars_fragment>
- #include <logdepthbuf_pars_fragment>
- #include <clipping_planes_pars_fragment>
- varying vec4 clipPositionCurrent;
- varying vec4 clipPositionPrevious;
- void main() {
- vec4 diffuseColor = vec4( 1.0 );
- diffuseColor.a = opacity;
- #include <map_fragment>
- #include <alphamap_fragment>
- #include <alphatest_fragment>
- vec2 ndcPositionCurrent = clipPositionCurrent.xy/clipPositionCurrent.w;
- vec2 ndcPositionPrevious = clipPositionPrevious.xy/clipPositionPrevious.w;
- vec2 vel = ( ndcPositionCurrent - ndcPositionPrevious ) * 0.5;
- vel = vel * 0.5 + 0.5;
- vec2 v1 = packDepthToRG(vel.x);
- vec2 v2 = packDepthToRG(vel.y);
- gl_FragColor = vec4(v1.x, v1.y, v2.x, v2.y);
- #include <logdepthbuf_fragment>
- }
- `
- };
- export { VelocityShader };
|