three
Version:
JavaScript 3D library
138 lines (102 loc) • 3.17 kB
JavaScript
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 */`
varying vec3 vViewPosition;
uniform mat4 previousProjectionViewMatrix;
uniform mat4 currentProjectionViewMatrix;
uniform mat4 modelMatrixPrev;
varying vec4 clipPositionCurrent;
varying vec4 clipPositionPrevious;
void main() {
vec4 mvPosition = modelViewMatrix * skinned;
clipPositionCurrent = currentProjectionViewMatrix * modelMatrix * skinned;
clipPositionPrevious = previousProjectionViewMatrix * modelMatrixPrev * skinned;
vec4 mvPosition = modelViewMatrix * vec4( transformed, 1.0 );
clipPositionCurrent = currentProjectionViewMatrix * modelMatrix * vec4( transformed, 1.0 );
clipPositionPrevious = previousProjectionViewMatrix * modelMatrixPrev * vec4( transformed, 1.0 );
gl_Position = projectionMatrix * mvPosition;
}
`,
fragmentShader: /* glsl */`
uniform float opacity;
varying vec4 clipPositionCurrent;
varying vec4 clipPositionPrevious;
void main() {
vec4 diffuseColor = vec4( 1.0 );
diffuseColor.a = opacity;
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);
}
`
};
export { VelocityShader };