NodePostProcessing.js 2.9 KB

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