import { UniformsLib, UniformsUtils, Matrix4 } from 'three'; /** * Mesh Velocity Shader @bhouston */ 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 #include #include #include #include #include #include #include #include uniform mat4 previousProjectionViewMatrix; uniform mat4 currentProjectionViewMatrix; uniform mat4 modelMatrixPrev; varying vec4 clipPositionCurrent; varying vec4 clipPositionPrevious; void main() { #include #include #include #include #include #include #include #include #include #include #include #include #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 #include } `, fragmentShader: /* glsl */` #define NORMAL uniform float opacity; #include #include #include #include #include #include #include varying vec4 clipPositionCurrent; varying vec4 clipPositionPrevious; void main() { vec4 diffuseColor = vec4( 1.0 ); diffuseColor.a = opacity; #include #include #include 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 } ` }; export { VelocityShader };