UNPKG

@deck.gl/core

Version:

deck.gl core library

78 lines (66 loc) 2.28 kB
// deck.gl // SPDX-License-Identifier: MIT // Copyright (c) vis.gl contributors // Attribution: This class and the multipass system were inspired by // the THREE.js EffectComposer and *Pass classes import type {Device, Framebuffer} from '@luma.gl/core'; import {ClipSpace} from '@luma.gl/engine'; import type {ShaderModule} from '@luma.gl/shadertools'; import Pass from './pass'; import {ScreenProps, screenUniforms} from './screen-pass-uniforms'; type ScreenPassProps = { module: ShaderModule; fs: string; id: string; }; type ScreenPassRenderOptions = { clearCanvas?: boolean; inputBuffer: Framebuffer; outputBuffer: Framebuffer | null; moduleProps: ShaderModule['props']; }; /** A base render pass. */ export default class ScreenPass extends Pass { model: ClipSpace; constructor(device: Device, props: ScreenPassProps) { super(device, props); const {module, fs, id} = props; const parameters = {depthWriteEnabled: false, depthCompare: 'always' as const}; this.model = new ClipSpace(device, {id, fs, modules: [module, screenUniforms], parameters}); } render(params: ScreenPassRenderOptions): void { this._renderPass(this.device, params); } delete() { this.model.destroy(); this.model = null!; } // Private methods /** * Renders the pass. * This is an abstract method that should be overridden. * @param inputBuffer - Frame buffer that contains the result of the previous pass * @param outputBuffer - Frame buffer that serves as the output render target */ protected _renderPass(device: Device, options: ScreenPassRenderOptions) { const {clearCanvas, inputBuffer, outputBuffer} = options; const texSize: [number, number] = [inputBuffer.width, inputBuffer.height]; const screenProps: ScreenProps = { texSrc: inputBuffer.colorAttachments[0], texSize }; this.model.shaderInputs.setProps({ screen: screenProps, ...options.moduleProps }); const renderPass = this.device.beginRenderPass({ framebuffer: outputBuffer, parameters: {viewport: [0, 0, ...texSize]}, clearColor: clearCanvas ? [0, 0, 0, 0] : false, clearDepth: 1, clearStencil: false }); this.model.draw(renderPass); renderPass.end(); } }