NodePostProcessing.js 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. import {
  2. LinearFilter,
  3. Mesh,
  4. OrthographicCamera,
  5. PlaneGeometry,
  6. RGBAFormat,
  7. Scene,
  8. Vector2,
  9. WebGLRenderTarget
  10. } from '../../../../build/three.module.js';
  11. import { NodeMaterial } from '../materials/NodeMaterial.js';
  12. import { ScreenNode } from '../inputs/ScreenNode.js';
  13. class NodePostProcessing {
  14. constructor( renderer, renderTarget ) {
  15. if ( renderTarget === undefined ) {
  16. const parameters = {
  17. minFilter: LinearFilter,
  18. magFilter: LinearFilter,
  19. format: RGBAFormat
  20. };
  21. const size = renderer.getDrawingBufferSize( new Vector2() );
  22. renderTarget = new WebGLRenderTarget( size.width, size.height, parameters );
  23. }
  24. this.renderer = renderer;
  25. this.renderTarget = renderTarget;
  26. this.output = new ScreenNode();
  27. this.material = new NodeMaterial();
  28. this.camera = new OrthographicCamera( - 1, 1, 1, - 1, 0, 1 );
  29. this.scene = new Scene();
  30. this.quad = new Mesh( new PlaneGeometry( 2, 2 ), this.material );
  31. this.quad.frustumCulled = false; // Avoid getting clipped
  32. this.scene.add( this.quad );
  33. this.needsUpdate = true;
  34. }
  35. render( scene, camera, frame ) {
  36. if ( this.needsUpdate ) {
  37. this.material.dispose();
  38. this.material.fragment.value = this.output;
  39. this.material.build();
  40. if ( this.material.uniforms.renderTexture ) {
  41. this.material.uniforms.renderTexture.value = this.renderTarget.texture;
  42. }
  43. this.needsUpdate = false;
  44. }
  45. frame.setRenderer( this.renderer )
  46. .setRenderTexture( this.renderTarget.texture );
  47. this.renderer.setRenderTarget( this.renderTarget );
  48. this.renderer.render( scene, camera );
  49. frame.updateNode( this.material );
  50. this.renderer.setRenderTarget( null );
  51. this.renderer.render( this.scene, this.camera );
  52. }
  53. setPixelRatio( value ) {
  54. this.renderer.setPixelRatio( value );
  55. const size = this.renderer.getSize( new Vector2() );
  56. this.setSize( size.width, size.height );
  57. }
  58. setSize( width, height ) {
  59. const pixelRatio = this.renderer.getPixelRatio();
  60. this.renderTarget.setSize( width * pixelRatio, height * pixelRatio );
  61. this.renderer.setSize( width, height );
  62. }
  63. copy( source ) {
  64. this.output = source.output;
  65. return this;
  66. }
  67. toJSON( meta ) {
  68. const isRootObject = ( meta === undefined || typeof meta === 'string' );
  69. if ( isRootObject ) {
  70. meta = {
  71. nodes: {}
  72. };
  73. }
  74. if ( meta && ! meta.post ) meta.post = {};
  75. if ( ! meta.post[ this.uuid ] ) {
  76. const data = {};
  77. data.uuid = this.uuid;
  78. data.type = 'NodePostProcessing';
  79. meta.post[ this.uuid ] = data;
  80. if ( this.name !== '' ) data.name = this.name;
  81. if ( JSON.stringify( this.userData ) !== '{}' ) data.userData = this.userData;
  82. data.output = this.output.toJSON( meta ).uuid;
  83. }
  84. meta.post = this.uuid;
  85. return meta;
  86. }
  87. }
  88. export { NodePostProcessing };