Buckets:
| import NodeMaterial from '../../materials/nodes/NodeMaterial.js'; | |
| import { vec4, renderOutput } from '../../nodes/TSL.js'; | |
| import { LinearSRGBColorSpace, NoToneMapping } from '../../constants.js'; | |
| import QuadMesh from '../../renderers/common/QuadMesh.js'; | |
| /** | |
| * This module is responsible to manage the post processing setups in apps. | |
| * You usually create a single instance of this class and use it to define | |
| * the output of your post processing effect chain. | |
| * ```js | |
| * const postProcessing = new PostProcessing( renderer ); | |
| * | |
| * const scenePass = pass( scene, camera ); | |
| * | |
| * postProcessing.outputNode = scenePass; | |
| * ``` | |
| * | |
| * Note: This module can only be used with `WebGPURenderer`. | |
| */ | |
| class PostProcessing { | |
| /** | |
| * Constructs a new post processing management module. | |
| * | |
| * @param {Renderer} renderer - A reference to the renderer. | |
| * @param {Node<vec4>} outputNode - An optional output node. | |
| */ | |
| constructor( renderer, outputNode = vec4( 0, 0, 1, 1 ) ) { | |
| /** | |
| * A reference to the renderer. | |
| * | |
| * @type {Renderer} | |
| */ | |
| this.renderer = renderer; | |
| /** | |
| * A node which defines the final output of the post | |
| * processing. This is usually the last node in a chain | |
| * of effect nodes. | |
| * | |
| * @type {Node<vec4>} | |
| */ | |
| this.outputNode = outputNode; | |
| /** | |
| * Whether the default output tone mapping and color | |
| * space transformation should be enabled or not. | |
| * | |
| * It is enabled by default by it must be disabled when | |
| * effects must be executed after tone mapping and color | |
| * space conversion. A typical example is FXAA which | |
| * requires sRGB input. | |
| * | |
| * When set to `false`, the app must control the output | |
| * transformation with `RenderOutputNode`. | |
| * | |
| * ```js | |
| * const outputPass = renderOutput( scenePass ); | |
| * ``` | |
| * | |
| * @type {boolean} | |
| */ | |
| this.outputColorTransform = true; | |
| /** | |
| * Must be set to `true` when the output node changes. | |
| * | |
| * @type {Node<vec4>} | |
| */ | |
| this.needsUpdate = true; | |
| const material = new NodeMaterial(); | |
| material.name = 'PostProcessing'; | |
| /** | |
| * The full screen quad that is used to render | |
| * the effects. | |
| * | |
| * @private | |
| * @type {QuadMesh} | |
| */ | |
| this._quadMesh = new QuadMesh( material ); | |
| } | |
| /** | |
| * When `PostProcessing` is used to apply post processing effects, | |
| * the application must use this version of `render()` inside | |
| * its animation loop (not the one from the renderer). | |
| */ | |
| render() { | |
| this._update(); | |
| const renderer = this.renderer; | |
| const toneMapping = renderer.toneMapping; | |
| const outputColorSpace = renderer.outputColorSpace; | |
| renderer.toneMapping = NoToneMapping; | |
| renderer.outputColorSpace = LinearSRGBColorSpace; | |
| // | |
| const currentXR = renderer.xr.enabled; | |
| renderer.xr.enabled = false; | |
| this._quadMesh.render( renderer ); | |
| renderer.xr.enabled = currentXR; | |
| // | |
| renderer.toneMapping = toneMapping; | |
| renderer.outputColorSpace = outputColorSpace; | |
| } | |
| /** | |
| * Frees internal resources. | |
| */ | |
| dispose() { | |
| this._quadMesh.material.dispose(); | |
| } | |
| /** | |
| * Updates the state of the module. | |
| * | |
| * @private | |
| */ | |
| _update() { | |
| if ( this.needsUpdate === true ) { | |
| const renderer = this.renderer; | |
| const toneMapping = renderer.toneMapping; | |
| const outputColorSpace = renderer.outputColorSpace; | |
| this._quadMesh.material.fragmentNode = this.outputColorTransform === true ? renderOutput( this.outputNode, toneMapping, outputColorSpace ) : this.outputNode.context( { toneMapping, outputColorSpace } ); | |
| this._quadMesh.material.needsUpdate = true; | |
| this.needsUpdate = false; | |
| } | |
| } | |
| /** | |
| * When `PostProcessing` is used to apply post processing effects, | |
| * the application must use this version of `renderAsync()` inside | |
| * its animation loop (not the one from the renderer). | |
| * | |
| * @async | |
| * @return {Promise} A Promise that resolves when the render has been finished. | |
| */ | |
| async renderAsync() { | |
| this._update(); | |
| const renderer = this.renderer; | |
| const toneMapping = renderer.toneMapping; | |
| const outputColorSpace = renderer.outputColorSpace; | |
| renderer.toneMapping = NoToneMapping; | |
| renderer.outputColorSpace = LinearSRGBColorSpace; | |
| // | |
| const currentXR = renderer.xr.enabled; | |
| renderer.xr.enabled = false; | |
| await this._quadMesh.renderAsync( renderer ); | |
| renderer.xr.enabled = currentXR; | |
| // | |
| renderer.toneMapping = toneMapping; | |
| renderer.outputColorSpace = outputColorSpace; | |
| } | |
| } | |
| export default PostProcessing; | |
Xet Storage Details
- Size:
- 4.44 kB
- Xet hash:
- 23ab0f452a2e9563b03c0377b2f7530d6f4c27d37a1bb1f106c6882808f0a396
·
Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.