123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183 |
- import {
- Color
- } from 'three';
- import { Pass } from './Pass.js';
- /**
- * This class represents a render pass. It takes a camera and a scene and produces
- * a beauty pass for subsequent post processing effects.
- *
- * ```js
- * const renderPass = new RenderPass( scene, camera );
- * composer.addPass( renderPass );
- * ```
- *
- * @augments Pass
- * @three_import import { RenderPass } from 'three/addons/postprocessing/RenderPass.js';
- */
- class RenderPass extends Pass {
- /**
- * Constructs a new render pass.
- *
- * @param {Scene} scene - The scene to render.
- * @param {Camera} camera - The camera.
- * @param {?Material} [overrideMaterial=null] - The override material. If set, this material is used
- * for all objects in the scene.
- * @param {?(number|Color|string)} [clearColor=null] - The clear color of the render pass.
- * @param {?number} [clearAlpha=null] - The clear alpha of the render pass.
- */
- constructor( scene, camera, overrideMaterial = null, clearColor = null, clearAlpha = null ) {
- super();
- /**
- * The scene to render.
- *
- * @type {Scene}
- */
- this.scene = scene;
- /**
- * The camera.
- *
- * @type {Camera}
- */
- this.camera = camera;
- /**
- * The override material. If set, this material is used
- * for all objects in the scene.
- *
- * @type {?Material}
- * @default null
- */
- this.overrideMaterial = overrideMaterial;
- /**
- * The clear color of the render pass.
- *
- * @type {?(number|Color|string)}
- * @default null
- */
- this.clearColor = clearColor;
- /**
- * The clear alpha of the render pass.
- *
- * @type {?number}
- * @default null
- */
- this.clearAlpha = clearAlpha;
- /**
- * Overwritten to perform a clear operation by default.
- *
- * @type {boolean}
- * @default true
- */
- this.clear = true;
- /**
- * If set to `true`, only the depth can be cleared when `clear` is to `false`.
- *
- * @type {boolean}
- * @default false
- */
- this.clearDepth = false;
- /**
- * Overwritten to disable the swap.
- *
- * @type {boolean}
- * @default false
- */
- this.needsSwap = false;
- this._oldClearColor = new Color();
- }
- /**
- * Performs a beauty pass with the configured scene and camera.
- *
- * @param {WebGLRenderer} renderer - The renderer.
- * @param {WebGLRenderTarget} writeBuffer - The write buffer. This buffer is intended as the rendering
- * destination for the pass.
- * @param {WebGLRenderTarget} readBuffer - The read buffer. The pass can access the result from the
- * previous pass from this buffer.
- * @param {number} deltaTime - The delta time in seconds.
- * @param {boolean} maskActive - Whether masking is active or not.
- */
- render( renderer, writeBuffer, readBuffer /*, deltaTime, maskActive */ ) {
- const oldAutoClear = renderer.autoClear;
- renderer.autoClear = false;
- let oldClearAlpha, oldOverrideMaterial;
- if ( this.overrideMaterial !== null ) {
- oldOverrideMaterial = this.scene.overrideMaterial;
- this.scene.overrideMaterial = this.overrideMaterial;
- }
- if ( this.clearColor !== null ) {
- renderer.getClearColor( this._oldClearColor );
- renderer.setClearColor( this.clearColor, renderer.getClearAlpha() );
- }
- if ( this.clearAlpha !== null ) {
- oldClearAlpha = renderer.getClearAlpha();
- renderer.setClearAlpha( this.clearAlpha );
- }
- if ( this.clearDepth == true ) {
- renderer.clearDepth();
- }
- renderer.setRenderTarget( this.renderToScreen ? null : readBuffer );
- if ( this.clear === true ) {
- // TODO: Avoid using autoClear properties, see https://github.com/mrdoob/three.js/pull/15571#issuecomment-465669600
- renderer.clear( renderer.autoClearColor, renderer.autoClearDepth, renderer.autoClearStencil );
- }
- renderer.render( this.scene, this.camera );
- // restore
- if ( this.clearColor !== null ) {
- renderer.setClearColor( this._oldClearColor );
- }
- if ( this.clearAlpha !== null ) {
- renderer.setClearAlpha( oldClearAlpha );
- }
- if ( this.overrideMaterial !== null ) {
- this.scene.overrideMaterial = oldOverrideMaterial;
- }
- renderer.autoClear = oldAutoClear;
- }
- }
- export { RenderPass };
|