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 };
 |