| import { |
| ColorManagement, |
| RawShaderMaterial, |
| UniformsUtils, |
| LinearToneMapping, |
| ReinhardToneMapping, |
| CineonToneMapping, |
| AgXToneMapping, |
| ACESFilmicToneMapping, |
| SRGBTransfer |
| } from 'three'; |
| import { Pass, FullScreenQuad } from './Pass.js'; |
| import { OutputShader } from '../shaders/OutputShader.js'; |
|
|
| class OutputPass extends Pass { |
|
|
| constructor() { |
|
|
| super(); |
|
|
| |
|
|
| const shader = OutputShader; |
|
|
| this.uniforms = UniformsUtils.clone( shader.uniforms ); |
|
|
| this.material = new RawShaderMaterial( { |
| name: shader.name, |
| uniforms: this.uniforms, |
| vertexShader: shader.vertexShader, |
| fragmentShader: shader.fragmentShader |
| } ); |
|
|
| this.fsQuad = new FullScreenQuad( this.material ); |
|
|
| |
|
|
| this._outputColorSpace = null; |
| this._toneMapping = null; |
|
|
| } |
|
|
| render( renderer, writeBuffer, readBuffer ) { |
|
|
| this.uniforms[ 'tDiffuse' ].value = readBuffer.texture; |
| this.uniforms[ 'toneMappingExposure' ].value = renderer.toneMappingExposure; |
|
|
| |
|
|
| if ( this._outputColorSpace !== renderer.outputColorSpace || this._toneMapping !== renderer.toneMapping ) { |
|
|
| this._outputColorSpace = renderer.outputColorSpace; |
| this._toneMapping = renderer.toneMapping; |
|
|
| this.material.defines = {}; |
|
|
| if ( ColorManagement.getTransfer( this._outputColorSpace ) === SRGBTransfer ) this.material.defines.SRGB_TRANSFER = ''; |
|
|
| if ( this._toneMapping === LinearToneMapping ) this.material.defines.LINEAR_TONE_MAPPING = ''; |
| else if ( this._toneMapping === ReinhardToneMapping ) this.material.defines.REINHARD_TONE_MAPPING = ''; |
| else if ( this._toneMapping === CineonToneMapping ) this.material.defines.CINEON_TONE_MAPPING = ''; |
| else if ( this._toneMapping === ACESFilmicToneMapping ) this.material.defines.ACES_FILMIC_TONE_MAPPING = ''; |
| else if ( this._toneMapping === AgXToneMapping ) this.material.defines.AGX_TONE_MAPPING = ''; |
|
|
| this.material.needsUpdate = true; |
|
|
| } |
|
|
| |
|
|
| if ( this.renderToScreen === true ) { |
|
|
| renderer.setRenderTarget( null ); |
| this.fsQuad.render( renderer ); |
|
|
| } else { |
|
|
| renderer.setRenderTarget( writeBuffer ); |
| if ( this.clear ) renderer.clear( renderer.autoClearColor, renderer.autoClearDepth, renderer.autoClearStencil ); |
| this.fsQuad.render( renderer ); |
|
|
| } |
|
|
| } |
|
|
| dispose() { |
|
|
| this.material.dispose(); |
| this.fsQuad.dispose(); |
|
|
| } |
|
|
| } |
|
|
| export { OutputPass }; |
|
|