131 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			131 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
|  | 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 <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 }; |