AfterimagePass.js 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. THREE.AfterimagePass = function ( damp ) {
  2. THREE.Pass.call( this );
  3. if ( THREE.AfterimageShader === undefined )
  4. console.error( 'THREE.AfterimagePass relies on THREE.AfterimageShader' );
  5. this.shader = THREE.AfterimageShader;
  6. this.uniforms = THREE.UniformsUtils.clone( this.shader.uniforms );
  7. this.uniforms[ 'damp' ].value = damp !== undefined ? damp : 0.96;
  8. this.textureComp = new THREE.WebGLRenderTarget( window.innerWidth, window.innerHeight, {
  9. minFilter: THREE.LinearFilter,
  10. magFilter: THREE.NearestFilter,
  11. format: THREE.RGBAFormat
  12. } );
  13. this.textureOld = new THREE.WebGLRenderTarget( window.innerWidth, window.innerHeight, {
  14. minFilter: THREE.LinearFilter,
  15. magFilter: THREE.NearestFilter,
  16. format: THREE.RGBAFormat
  17. } );
  18. this.shaderMaterial = new THREE.ShaderMaterial( {
  19. uniforms: this.uniforms,
  20. vertexShader: this.shader.vertexShader,
  21. fragmentShader: this.shader.fragmentShader
  22. } );
  23. this.compFsQuad = new THREE.Pass.FullScreenQuad( this.shaderMaterial );
  24. var material = new THREE.MeshBasicMaterial();
  25. this.copyFsQuad = new THREE.Pass.FullScreenQuad( material );
  26. };
  27. THREE.AfterimagePass.prototype = Object.assign( Object.create( THREE.Pass.prototype ), {
  28. constructor: THREE.AfterimagePass,
  29. render: function ( renderer, writeBuffer, readBuffer ) {
  30. this.uniforms[ 'tOld' ].value = this.textureOld.texture;
  31. this.uniforms[ 'tNew' ].value = readBuffer.texture;
  32. renderer.setRenderTarget( this.textureComp );
  33. this.compFsQuad.render( renderer );
  34. this.copyFsQuad.material.map = this.textureComp.texture;
  35. if ( this.renderToScreen ) {
  36. renderer.setRenderTarget( null );
  37. this.copyFsQuad.render( renderer );
  38. } else {
  39. renderer.setRenderTarget( writeBuffer );
  40. if ( this.clear ) renderer.clear();
  41. this.copyFsQuad.render( renderer );
  42. }
  43. // Swap buffers.
  44. var temp = this.textureOld;
  45. this.textureOld = this.textureComp;
  46. this.textureComp = temp;
  47. // Now textureOld contains the latest image, ready for the next frame.
  48. },
  49. setSize: function ( width, height ) {
  50. this.textureComp.setSize( width, height );
  51. this.textureOld.setSize( width, height );
  52. }
  53. } );