src/passes/RenderPass.js
import { ClearPass } from "./ClearPass.js";
import { Pass } from "./Pass.js";
/**
* A pass that renders a given scene directly on screen or into the read buffer
* for further processing.
*/
export class RenderPass extends Pass {
/**
* Constructs a new render pass.
*
* @param {Scene} scene - The scene to render.
* @param {Camera} camera - The camera to use to render the scene.
* @param {Object} [options] - Additional options.
* @param {Material} [options.overrideMaterial=null] - An override material for the scene.
* @param {Color} [options.clearColor=null] - An override clear color.
* @param {Number} [options.clearAlpha=1.0] - An override clear alpha.
* @param {Boolean} [options.clearDepth=false] - Whether depth should be cleared explicitly.
* @param {Boolean} [options.clear=true] - Whether all buffers should be cleared.
*/
constructor(scene, camera, options = {}) {
super("RenderPass", scene, camera);
this.needsSwap = false;
/**
* A clear pass.
*
* @type {ClearPass}
*/
this.clearPass = new ClearPass(options);
/**
* An override material.
*
* @type {Material}
*/
this.overrideMaterial = (options.overrideMaterial !== undefined) ? options.overrideMaterial : null;
/**
* Indicates whether the depth buffer should be cleared explicitly.
*
* @type {Boolean}
*/
this.clearDepth = (options.clearDepth !== undefined) ? options.clearDepth : false;
/**
* Indicates whether the color, depth and stencil buffers should be cleared.
*
* Even with clear set to true you can prevent specific buffers from being
* cleared by setting either the autoClearColor, autoClearStencil or
* autoClearDepth properties of the renderer to false.
*
* @type {Boolean}
*/
this.clear = (options.clear !== undefined) ? options.clear : true;
}
/**
* Renders the scene.
*
* @param {WebGLRenderer} renderer - The renderer.
* @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.
* @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen.
* @param {Number} [delta] - The time between the last frame and the current one in seconds.
* @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active.
*/
render(renderer, inputBuffer, outputBuffer, delta, stencilTest) {
const scene = this.scene;
const renderTarget = this.renderToScreen ? null : inputBuffer;
const overrideMaterial = scene.overrideMaterial;
if(this.clear) {
this.clearPass.renderToScreen = this.renderToScreen;
this.clearPass.render(renderer, inputBuffer);
} else if(this.clearDepth) {
renderer.setRenderTarget(renderTarget);
renderer.clearDepth();
}
scene.overrideMaterial = this.overrideMaterial;
renderer.render(scene, this.camera, renderTarget);
scene.overrideMaterial = overrideMaterial;
}
}