NodePostProcessing.js 2.8 KB

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