From dda58fa4437173b5c0e8d3ffba269fa34ecbbf51 Mon Sep 17 00:00:00 2001 From: sunag Date: Sat, 13 Jul 2024 13:55:50 -0300 Subject: [PATCH 01/17] Introduce NodeHandler --- src/nodes/Nodes.js | 1 + src/nodes/core/NodeBuilder.js | 8 +++++++ src/nodes/core/NodeHandler.js | 33 +++++++++++++++++++++++++++++ src/nodes/materials/NodeMaterial.js | 14 +++++++++++- src/renderers/common/Renderer.js | 2 ++ 5 files changed, 57 insertions(+), 1 deletion(-) create mode 100644 src/nodes/core/NodeHandler.js diff --git a/src/nodes/Nodes.js b/src/nodes/Nodes.js index caec0e8a5bdb31..a34706dd91ab2a 100644 --- a/src/nodes/Nodes.js +++ b/src/nodes/Nodes.js @@ -34,6 +34,7 @@ export { default as UniformNode, uniform } from './core/UniformNode.js'; export { default as VaryingNode, varying } from './core/VaryingNode.js'; export { default as OutputStructNode, outputStruct } from './core/OutputStructNode.js'; export { default as MRTNode, mrt } from './core/MRTNode.js'; +export { default as NodeHandler } from './core/NodeHandler.js'; import * as NodeUtils from './core/NodeUtils.js'; export { NodeUtils }; diff --git a/src/nodes/core/NodeBuilder.js b/src/nodes/core/NodeBuilder.js index 9618b4e021ec5c..204684212f6b43 100644 --- a/src/nodes/core/NodeBuilder.js +++ b/src/nodes/core/NodeBuilder.js @@ -572,6 +572,14 @@ class NodeBuilder { } + handle( name, node ) { + + const handler = this.renderer.nodeHandler; + + return handler !== null ? handler.handle( name, node, this ) : node; + + } + getPropertyName( node/*, shaderStage*/ ) { return node.name; diff --git a/src/nodes/core/NodeHandler.js b/src/nodes/core/NodeHandler.js new file mode 100644 index 00000000000000..7a258c4f321289 --- /dev/null +++ b/src/nodes/core/NodeHandler.js @@ -0,0 +1,33 @@ +class NodeHandler { + + constructor() { + + this.handlers = []; + + } + + onHandle( name, callback ) { + + this.handlers[ name ] = callback; + + return this; + + } + + handle( name, node, builder ) { + + const callback = this.handlers[ name ]; + + if ( callback !== undefined ) { + + node = callback( node, builder ); + + } + + return node || null; + + } + +} + +export default NodeHandler; diff --git a/src/nodes/materials/NodeMaterial.js b/src/nodes/materials/NodeMaterial.js index 66e29f09866166..a88c633da0986b 100644 --- a/src/nodes/materials/NodeMaterial.js +++ b/src/nodes/materials/NodeMaterial.js @@ -415,14 +415,26 @@ class NodeMaterial extends Material { } + // AO + + let aoNode = null; + if ( this.aoNode !== null || builder.material.aoMap ) { - const aoNode = this.aoNode !== null ? this.aoNode : materialAOMap; + aoNode = this.aoNode !== null ? this.aoNode : materialAOMap; + + } + + aoNode = builder.handle( 'ao', aoNode ); + + if ( aoNode !== null ) { materialLightsNode.push( new AONode( aoNode ) ); } + // + let lightsN = this.lightsNode || builder.lightsNode; if ( materialLightsNode.length > 0 ) { diff --git a/src/renderers/common/Renderer.js b/src/renderers/common/Renderer.js index 97f26a2d53af6e..2fbf85d1889821 100644 --- a/src/renderers/common/Renderer.js +++ b/src/renderers/common/Renderer.js @@ -135,6 +135,8 @@ class Renderer { // backwards compatibility + this.nodeHandler = null; + this.shadowMap = { enabled: false, type: null From 677d83f295d004fa95f37a227866ce940cc09cec Mon Sep 17 00:00:00 2001 From: sunag Date: Sat, 13 Jul 2024 13:56:33 -0300 Subject: [PATCH 02/17] Introduce `renderer.transparent` and `renderer.opaque` --- src/renderers/common/Renderer.js | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/renderers/common/Renderer.js b/src/renderers/common/Renderer.js index 2fbf85d1889821..49bf0541dae0d5 100644 --- a/src/renderers/common/Renderer.js +++ b/src/renderers/common/Renderer.js @@ -135,6 +135,9 @@ class Renderer { // backwards compatibility + this.transparent = true; + this.opaque = true; + this.nodeHandler = null; this.shadowMap = { @@ -319,8 +322,8 @@ class Renderer { const transparentObjects = renderList.transparent; const lightsNode = renderList.lightsNode; - if ( opaqueObjects.length > 0 ) this._renderObjects( opaqueObjects, camera, sceneRef, lightsNode ); - if ( transparentObjects.length > 0 ) this._renderObjects( transparentObjects, camera, sceneRef, lightsNode ); + if ( this.opaque === true && opaqueObjects.length > 0 ) this._renderObjects( opaqueObjects, camera, sceneRef, lightsNode ); + if ( this.transparent === true && transparentObjects.length > 0 ) this._renderObjects( transparentObjects, camera, sceneRef, lightsNode ); // restore render tree @@ -681,8 +684,8 @@ class Renderer { const lightsNode = renderList.lightsNode; if ( bundles.length > 0 ) this._renderBundles( bundles, sceneRef, lightsNode ); - if ( opaqueObjects.length > 0 ) this._renderObjects( opaqueObjects, camera, sceneRef, lightsNode ); - if ( transparentObjects.length > 0 ) this._renderObjects( transparentObjects, camera, sceneRef, lightsNode ); + if ( this.opaque === true && opaqueObjects.length > 0 ) this._renderObjects( opaqueObjects, camera, sceneRef, lightsNode ); + if ( this.transparent === true && transparentObjects.length > 0 ) this._renderObjects( transparentObjects, camera, sceneRef, lightsNode ); // finish render pass From 98992f717852e8e042a54933e1be4939d85f274d Mon Sep 17 00:00:00 2001 From: sunag Date: Sat, 13 Jul 2024 14:00:29 -0300 Subject: [PATCH 03/17] TSL: Introduce `after` and `before` --- src/nodes/Nodes.js | 1 + src/nodes/utils/AfterNode.js | 38 ++++++++++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+) create mode 100644 src/nodes/utils/AfterNode.js diff --git a/src/nodes/Nodes.js b/src/nodes/Nodes.js index a34706dd91ab2a..a4ca49af0f3835 100644 --- a/src/nodes/Nodes.js +++ b/src/nodes/Nodes.js @@ -35,6 +35,7 @@ export { default as VaryingNode, varying } from './core/VaryingNode.js'; export { default as OutputStructNode, outputStruct } from './core/OutputStructNode.js'; export { default as MRTNode, mrt } from './core/MRTNode.js'; export { default as NodeHandler } from './core/NodeHandler.js'; +export { default as AfterNode, after, before } from './utils/AfterNode.js'; import * as NodeUtils from './core/NodeUtils.js'; export { NodeUtils }; diff --git a/src/nodes/utils/AfterNode.js b/src/nodes/utils/AfterNode.js new file mode 100644 index 00000000000000..cfa92478cc609e --- /dev/null +++ b/src/nodes/utils/AfterNode.js @@ -0,0 +1,38 @@ +import Node from '../core/Node.js'; +import { nodeProxy, addNodeElement } from '../shadernode/ShaderNode.js'; + +class AfterNode extends Node { + + constructor( node, afterNode ) { + + super( 'void' ); + + this.node = node; + this.afterNode = afterNode; + + } + + getNodeType( builder ) { + + return this.afterNode.getNodeType( builder ); + + } + + setup( builder ) { + + this.node.build( builder ); + + return this.afterNode; + + } + +} + +export const after = nodeProxy( AfterNode ); +export const before = ( node, afterNode ) => after( afterNode, node ); + +addNodeElement( 'after', after ); +addNodeElement( 'before', before ); + +export default AfterNode; + From e206f0405e7cdc7dea6a9c5ec62d75d9a0ac4a89 Mon Sep 17 00:00:00 2001 From: sunag Date: Sat, 13 Jul 2024 14:01:11 -0300 Subject: [PATCH 04/17] add standardPass() and improve ao approach --- examples/webgpu_postprocessing_ao.html | 55 ++++--- examples/webgpu_postprocessing_standard.html | 146 +++++++++++++++++++ src/nodes/Nodes.js | 2 +- src/nodes/display/AfterImageNode.js | 5 +- src/nodes/display/GTAONode.js | 43 ++---- src/nodes/display/PassNode.js | 23 ++- src/nodes/display/StandardPassNode.js | 114 +++++++++++++++ 7 files changed, 337 insertions(+), 51 deletions(-) create mode 100644 examples/webgpu_postprocessing_standard.html create mode 100644 src/nodes/display/StandardPassNode.js diff --git a/examples/webgpu_postprocessing_ao.html b/examples/webgpu_postprocessing_ao.html index 2f6cf62e7f4a5f..0b575b63de36bc 100644 --- a/examples/webgpu_postprocessing_ao.html +++ b/examples/webgpu_postprocessing_ao.html @@ -10,8 +10,8 @@ + + + + \ No newline at end of file diff --git a/src/nodes/Nodes.js b/src/nodes/Nodes.js index a4ca49af0f3835..ad44c038ed7ffa 100644 --- a/src/nodes/Nodes.js +++ b/src/nodes/Nodes.js @@ -139,8 +139,8 @@ export { default as Lut3DNode, lut3D } from './display/Lut3DNode.js'; export { default as GTAONode, ao } from './display/GTAONode.js'; export { default as FXAANode, fxaa } from './display/FXAANode.js'; export { default as RenderOutputNode, renderOutput } from './display/RenderOutputNode.js'; - export { default as PassNode, pass, passTexture, depthPass } from './display/PassNode.js'; +export { default as StandardPassNode, standardPass } from './display/StandardPassNode.js'; // code export { default as ExpressionNode, expression } from './code/ExpressionNode.js'; diff --git a/src/nodes/display/AfterImageNode.js b/src/nodes/display/AfterImageNode.js index fae09e90257e79..405a42adfe5a1c 100644 --- a/src/nodes/display/AfterImageNode.js +++ b/src/nodes/display/AfterImageNode.js @@ -2,14 +2,15 @@ import TempNode from '../core/TempNode.js'; import { nodeObject, addNodeElement, tslFn, float, vec4 } from '../shadernode/ShaderNode.js'; import { NodeUpdateType } from '../core/constants.js'; import { uv } from '../accessors/UVNode.js'; +import { after } from '../utils/AfterNode.js' import { texture } from '../accessors/TextureNode.js'; -import { passTexture } from './PassNode.js'; import { uniform } from '../core/UniformNode.js'; import { sign, max } from '../math/MathNode.js'; import QuadMesh from '../../renderers/common/QuadMesh.js'; import { Vector2 } from '../../math/Vector2.js'; import { RenderTarget } from '../../core/RenderTarget.js'; +import { viewportTopLeft } from './ViewportNode.js'; const _size = new Vector2(); @@ -31,7 +32,7 @@ class AfterImageNode extends TempNode { this._oldRT = new RenderTarget(); this._oldRT.texture.name = 'AfterImageNode.old'; - this._textureNode = passTexture( this, this._compRT.texture ); + this._textureNode = texture( this._compRT.texture, viewportTopLeft ).before( this ); this.updateBeforeType = NodeUpdateType.RENDER; diff --git a/src/nodes/display/GTAONode.js b/src/nodes/display/GTAONode.js index 6113c7aa0dbb85..6fc3d3bf1bc0c6 100644 --- a/src/nodes/display/GTAONode.js +++ b/src/nodes/display/GTAONode.js @@ -19,14 +19,14 @@ import { Color } from '../../math/Color.js'; const _quadMesh = new QuadMesh(); const _currentClearColor = new Color(); +const _size = new Vector2(); class GTAONode extends TempNode { - constructor( textureNode, depthNode, normalNode, camera ) { + constructor( depthNode, normalNode, camera ) { super(); - this.textureNode = textureNode; this.depthNode = depthNode; this.normalNode = normalNode; @@ -36,7 +36,6 @@ class GTAONode extends TempNode { this.distanceExponent = uniform( 1 ); this.distanceFallOff = uniform( 1 ); this.scale = uniform( 1 ); - this.blendIntensity = uniform( 1 ); this.noiseNode = texture( generateMagicSquareNoise() ); this.cameraProjectionMatrix = uniform( camera.projectionMatrix ); @@ -50,7 +49,13 @@ class GTAONode extends TempNode { this._material = null; this._textureNode = passTexture( this, this._aoRenderTarget.texture ); - this.updateBeforeType = NodeUpdateType.RENDER; + this.updateBeforeType = NodeUpdateType.FRAME; + + } + + getTextureNode() { + + return this._textureNode; } @@ -65,25 +70,16 @@ class GTAONode extends TempNode { const { renderer } = frame; - const textureNode = this.textureNode; - const map = textureNode.value; + const size = renderer.getSize( _size ); const currentRenderTarget = renderer.getRenderTarget(); const currentMRT = renderer.getMRT(); renderer.getClearColor( _currentClearColor ); const currentClearAlpha = renderer.getClearAlpha(); - - const currentTexture = textureNode.value; - _quadMesh.material = this._material; - this.setSize( map.image.width, map.image.height ); - - - const textureType = map.type; - - this._aoRenderTarget.texture.type = textureType; + this.setSize( size.width, size.height ); // clear @@ -100,17 +96,13 @@ class GTAONode extends TempNode { renderer.setRenderTarget( currentRenderTarget ); renderer.setMRT( currentMRT ); renderer.setClearColor( _currentClearColor, currentClearAlpha ); - textureNode.value = currentTexture; } setup( builder ) { - const { textureNode } = this; - const uvNode = uv(); - const sampleTexture = ( uv ) => textureNode.uv( uv ); const sampleDepth = ( uv ) => this.depthNode.uv( uv ).x; const sampleNoise = ( uv ) => this.noiseNode.uv( uv ); @@ -223,22 +215,13 @@ class GTAONode extends TempNode { } ); - const composite = tslFn( () => { - - const beauty = sampleTexture( uvNode ); - const ao = this._textureNode.uv( uvNode ); - - return beauty.mul( mix( vec3( 1.0 ), ao, this.blendIntensity ) ); - - } ); - const material = this._material || ( this._material = builder.createNodeMaterial() ); material.fragmentNode = ao().context( builder.getSharedContext() ); material.needsUpdate = true; // - return composite(); + return this._textureNode; } @@ -328,7 +311,7 @@ function generateMagicSquare( size ) { } -export const ao = ( node, depthNode, normalNode, camera ) => nodeObject( new GTAONode( nodeObject( node ).toTexture(), nodeObject( depthNode ), nodeObject( normalNode ), camera ) ); +export const ao = ( depthNode, normalNode, camera ) => nodeObject( new GTAONode( nodeObject( depthNode ), nodeObject( normalNode ), camera ) ); addNodeElement( 'ao', ao ); diff --git a/src/nodes/display/PassNode.js b/src/nodes/display/PassNode.js index 59bc3b4ac1a4a9..5e039ebaf1bfb3 100644 --- a/src/nodes/display/PassNode.js +++ b/src/nodes/display/PassNode.js @@ -10,6 +10,7 @@ import { HalfFloatType/*, FloatType*/ } from '../../constants.js'; import { Vector2 } from '../../math/Vector2.js'; import { DepthTexture } from '../../textures/DepthTexture.js'; import { RenderTarget } from '../../core/RenderTarget.js'; +import { viewportTopLeft } from './ViewportNode.js'; const _size = new Vector2(); @@ -17,7 +18,7 @@ class PassTextureNode extends TextureNode { constructor( passNode, texture ) { - super( texture ); + super( texture, viewportTopLeft ); this.passNode = passNode; @@ -78,6 +79,11 @@ class PassNode extends TempNode { this.camera = camera; this.options = options; + this.opaque = true; + this.transparent = true; + this.overrideMaterial = null; + this.handler = null; + this._pixelRatio = 1; this._width = 1; this._height = 1; @@ -231,17 +237,32 @@ class PassNode extends TempNode { const currentRenderTarget = renderer.getRenderTarget(); const currentMRT = renderer.getMRT(); + const currentOpaque = renderer.opaque; + const currentTransparent = renderer.transparent; + const currentNodeHandler = renderer.nodeHandler; this._cameraNear.value = camera.near; this._cameraFar.value = camera.far; + const currentOverrideMaterial = scene.overrideMaterial; + scene.overrideMaterial = this.overrideMaterial; + renderer.setRenderTarget( this.renderTarget ); renderer.setMRT( this._mrt ); + renderer.opaque = this.opaque; + renderer.transparent = this.transparent; + renderer.nodeHandler = this.handler; + renderer.render( scene, camera ); renderer.setRenderTarget( currentRenderTarget ); renderer.setMRT( currentMRT ); + renderer.opaque = currentOpaque; + renderer.transparent = currentTransparent; + renderer.nodeHandler = currentNodeHandler; + + scene.overrideMaterial = currentOverrideMaterial; } diff --git a/src/nodes/display/StandardPassNode.js b/src/nodes/display/StandardPassNode.js new file mode 100644 index 00000000000000..cd19e7b5c0b122 --- /dev/null +++ b/src/nodes/display/StandardPassNode.js @@ -0,0 +1,114 @@ +import Node, { addNodeClass } from '../core/Node.js'; +import NodeHandler from '../core/NodeHandler.js'; +import { nodeObject } from '../shadernode/ShaderNode.js'; +import { transformedNormalView } from '../accessors/NormalNode.js'; +import { ao } from './GTAONode.js'; +import { pass } from './PassNode.js'; +import NodeMaterial from '../materials/NodeMaterial.js'; +import { NearestFilter, UnsignedByteType } from '../../constants.js'; + +class StandardPassNode extends Node { + + constructor( scene, camera ) { + + super( 'vec4' ); + + // Opaque Pass + + const normalPassMaterial = new NodeMaterial(); + normalPassMaterial.lights = false; + normalPassMaterial.fog = false; + normalPassMaterial.colorNode = transformedNormalView.directionToColor(); + + const opaquePass = pass( scene, camera, { + minFilter: NearestFilter, + magFilter: NearestFilter, + type: UnsignedByteType + } ); + + opaquePass.transparent = false; + opaquePass.overrideMaterial = normalPassMaterial; + + // Textures + + const normalView = opaquePass.getTextureNode().colorToDirection(); + const depth = opaquePass.getTextureNode( 'depth' ); + + // AO + + const aoPass = ao( depth, normalView, camera ); + const aoTexture = aoPass.getTextureNode(); + + aoPass.scale.value = 2; + aoPass.thickness.value = 1; + aoPass.distanceExponent.value = 1; + + // Node Handler + + const handler = new NodeHandler(); + handler.onHandle( 'ao', ( node ) => { + + return node !== null ? aoTexture.mul( node ) : aoTexture; + + } ); + + // Final + + const scenePass = pass( scene, camera ); + scenePass.handler = handler; + + // Assigns + + this.scene = scene; + this.camera = camera; + + this.aoPassNode = aoPass; + this.scenePassNode = scenePass; + this.opaquePassNode = opaquePass; + + this.normalViewNode = normalView; + this.depthNode = depth; + + // + + this.isStandardPassNode = true; + + } + + isGlobal() { + + return true; + + } + + getViewZNode() { + + return this.scenePassNode.getViewZNode().before( this ); + + } + + getLinearDepthNode() { + + return this.scenePassNode.getLinearDepthNode().before( this ); + + } + + getTextureNode( name ) { + + return this.scenePassNode.getTextureNode( name ).before( this ); + + } + + setup() { + + return this.aoPassNode.after( this.scenePassNode ); + + } + +} + +export default StandardPassNode; + +export const standardPass = ( scene, camera ) => nodeObject( new StandardPassNode( scene, camera ) ); + +addNodeClass( 'StandardPassNode', StandardPassNode ); From 03dafb660d339cc3f6902a2548f5af188a60579d Mon Sep 17 00:00:00 2001 From: sunag Date: Sun, 14 Jul 2024 12:57:32 -0300 Subject: [PATCH 05/17] fix dispose rtt --- src/nodes/core/NodeHandler.js | 3 +++ src/renderers/common/Textures.js | 2 ++ src/renderers/webgpu/WebGPUBackend.js | 12 ++++++++++++ 3 files changed, 17 insertions(+) diff --git a/src/nodes/core/NodeHandler.js b/src/nodes/core/NodeHandler.js index 7a258c4f321289..4352fb7939de55 100644 --- a/src/nodes/core/NodeHandler.js +++ b/src/nodes/core/NodeHandler.js @@ -1,7 +1,10 @@ +let _id = 0; + class NodeHandler { constructor() { + this.id = _id ++; this.handlers = []; } diff --git a/src/renderers/common/Textures.js b/src/renderers/common/Textures.js index 5de632c66b0013..3f7c128e1b757e 100644 --- a/src/renderers/common/Textures.js +++ b/src/renderers/common/Textures.js @@ -119,6 +119,8 @@ class Textures extends DataMap { this._destroyTexture( depthTexture ); + this.delete( renderTarget ); + }; renderTarget.addEventListener( 'dispose', onDispose ); diff --git a/src/renderers/webgpu/WebGPUBackend.js b/src/renderers/webgpu/WebGPUBackend.js index c8daf4620a39b6..c827eab55f2af1 100644 --- a/src/renderers/webgpu/WebGPUBackend.js +++ b/src/renderers/webgpu/WebGPUBackend.js @@ -199,6 +199,18 @@ class WebGPUBackend extends Backend { renderTargetData.descriptors = descriptors; + // dispose + + const onDispose = () => { + + renderTarget.removeEventListener( 'dispose', onDispose ); + + this.delete( renderTarget ); + + }; + + renderTarget.addEventListener( 'dispose', onDispose ); + } if ( renderTargetData.width !== renderTarget.width || From c4917085913ddecf1b7d1f99b4b81fe54503a565 Mon Sep 17 00:00:00 2001 From: sunag Date: Sun, 14 Jul 2024 12:57:53 -0300 Subject: [PATCH 06/17] wip nodeHandler --- src/renderers/common/RenderContexts.js | 7 +++++-- src/renderers/common/Renderer.js | 4 ++-- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/renderers/common/RenderContexts.js b/src/renderers/common/RenderContexts.js index da21e6d9a0fed9..9b466277be8cc5 100644 --- a/src/renderers/common/RenderContexts.js +++ b/src/renderers/common/RenderContexts.js @@ -1,6 +1,9 @@ +import NodeHandler from '../../nodes/core/NodeHandler.js'; import ChainMap from './ChainMap.js'; import RenderContext from './RenderContext.js'; +const defaultHander = new NodeHandler(); + class RenderContexts { constructor() { @@ -9,9 +12,9 @@ class RenderContexts { } - get( scene, camera, renderTarget = null ) { + get( scene, camera, handler, renderTarget = null ) { - const chainKey = [ scene, camera ]; + const chainKey = [ scene, camera, handler || defaultHander ]; let attachmentState; diff --git a/src/renderers/common/Renderer.js b/src/renderers/common/Renderer.js index 49bf0541dae0d5..084d1247566b52 100644 --- a/src/renderers/common/Renderer.js +++ b/src/renderers/common/Renderer.js @@ -236,7 +236,7 @@ class Renderer { if ( targetScene === null ) targetScene = scene; const renderTarget = this._renderTarget; - const renderContext = this._renderContexts.get( targetScene, camera, renderTarget ); + const renderContext = this._renderContexts.get( targetScene, camera, this.nodeHandler, renderTarget ); const activeMipmapLevel = this._activeMipmapLevel; const compilationPromises = []; @@ -542,7 +542,7 @@ class Renderer { // - const renderContext = this._renderContexts.get( scene, camera, renderTarget ); + const renderContext = this._renderContexts.get( scene, camera, this.nodeHandler, renderTarget ); this._currentRenderContext = renderContext; this._currentRenderObjectFunction = this._renderObjectFunction || this.renderObject; From 2dcefd8255c9a57ded86ccd05f88714636c3e50e Mon Sep 17 00:00:00 2001 From: sunag Date: Sun, 14 Jul 2024 12:58:11 -0300 Subject: [PATCH 07/17] wip ao --- examples/webgpu_postprocessing_ao.html | 57 +++++------------------ src/nodes/display/StandardPassNode.js | 64 ++++++++++++++++++-------- 2 files changed, 57 insertions(+), 64 deletions(-) diff --git a/examples/webgpu_postprocessing_ao.html b/examples/webgpu_postprocessing_ao.html index 0b575b63de36bc..5bfb1d31cff83f 100644 --- a/examples/webgpu_postprocessing_ao.html +++ b/examples/webgpu_postprocessing_ao.html @@ -20,7 +20,7 @@ + + + + \ No newline at end of file From dcf2e52ad170ccce6813cc2c5490714f0d3d8078 Mon Sep 17 00:00:00 2001 From: sunag Date: Sat, 20 Jul 2024 03:18:15 -0300 Subject: [PATCH 13/17] remove standardPass --- src/nodes/Nodes.js | 2 - src/nodes/display/StandardPassNode.js | 142 -------------------------- 2 files changed, 144 deletions(-) delete mode 100644 src/nodes/display/StandardPassNode.js diff --git a/src/nodes/Nodes.js b/src/nodes/Nodes.js index bc84df968b79d3..297a065c49e6c9 100644 --- a/src/nodes/Nodes.js +++ b/src/nodes/Nodes.js @@ -143,9 +143,7 @@ export { default as BloomNode, bloom } from './display/BloomNode.js'; export { default as TransitionNode, transition } from './display/TransitionNode.js'; export { default as RenderOutputNode, renderOutput } from './display/RenderOutputNode.js'; export { default as PixelationPassNode, pixelationPass } from './display/PixelationPassNode.js'; - export { default as PassNode, pass, passTexture, depthPass } from './display/PassNode.js'; -export { default as StandardPassNode, standardPass } from './display/StandardPassNode.js'; // code export { default as ExpressionNode, expression } from './code/ExpressionNode.js'; diff --git a/src/nodes/display/StandardPassNode.js b/src/nodes/display/StandardPassNode.js deleted file mode 100644 index ab3a03acd7e05a..00000000000000 --- a/src/nodes/display/StandardPassNode.js +++ /dev/null @@ -1,142 +0,0 @@ -import Node, { addNodeClass } from '../core/Node.js'; -import NodeHandler from '../core/NodeHandler.js'; -import { nodeObject } from '../shadernode/ShaderNode.js'; -import { transformedNormalView } from '../accessors/NormalNode.js'; -import { ao } from './GTAONode.js'; -import { pass } from './PassNode.js'; -import NodeMaterial from '../materials/NodeMaterial.js'; -import { NearestFilter, UnsignedByteType } from '../../constants.js'; - -class StandardPassNode extends Node { - - constructor( scene, camera, options = { enableAO: false } ) { - - super( 'vec4' ); - - const { enableAO } = options; - - // Opaque Pass - - const normalPassMaterial = new NodeMaterial(); - normalPassMaterial.lights = false; - normalPassMaterial.fog = false; - normalPassMaterial.colorNode = transformedNormalView.directionToColor(); - - const opaquePass = pass( scene, camera, { - minFilter: NearestFilter, - magFilter: NearestFilter, - type: UnsignedByteType - } ); - - opaquePass.transparent = false; - opaquePass.overrideMaterial = normalPassMaterial; - - // Textures - - const normalView = opaquePass.getTextureNode().colorToDirection(); - const depth = opaquePass.getTextureNode( 'depth' ); - - // AO - - const aoPass = ao( depth, normalView, camera ); - - // Final - - const scenePass = pass( scene, camera ); - - // Assigns - - this.scene = scene; - this.camera = camera; - - this.aoPassNode = aoPass; - this.scenePassNode = scenePass; - this.opaquePassNode = opaquePass; - - this.normalViewNode = normalView; - this.depthNode = depth; - - this.enableAO = enableAO; - this.aoIntensityNode = null; - - // - - this.isStandardPassNode = true; - - } - - set needsUpdate( value ) { - - if ( value === true ) { - - this.dispose(); - - } - - } - - dispose() { - - this.scenePassNode.dispose(); - - } - - isGlobal() { - - return true; - - } - - getViewZNode() { - - return this.scenePassNode.getViewZNode().before( this ); - - } - - getLinearDepthNode() { - - return this.scenePassNode.getLinearDepthNode().before( this ); - - } - - getTextureNode( name ) { - - return this.scenePassNode.getTextureNode( name ).before( this ); - - } - - setup() { - - const handler = new NodeHandler(); - - let composer = this.scenePassNode; - - if ( this.enableAO ) { - - const aoTexture = this.aoPassNode.getTextureNode(); - - handler.onHandle( 'ao', ( node ) => { - - const sceneAO = this.aoIntensityNode !== null ? this.aoIntensityNode.mix( 1, aoTexture ) : aoTexture; - - return node !== null ? sceneAO.mul( node ) : sceneAO; - - } ); - - composer = composer.before( this.aoPassNode ); - - } - - this.scenePassNode.handler = handler; - - return composer; - - } - -} - -export default StandardPassNode; - -export const standardPass = ( scene, camera, options ) => nodeObject( new StandardPassNode( scene, camera, options ) ); - -addNodeClass( 'StandardPassNode', StandardPassNode ); From 1b95e74ae0446f25e3426ef7dab33638eaefebf9 Mon Sep 17 00:00:00 2001 From: sunag Date: Sat, 20 Jul 2024 03:18:36 -0300 Subject: [PATCH 14/17] added .toTexture() for others parameters --- src/nodes/display/DenoiseNode.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/nodes/display/DenoiseNode.js b/src/nodes/display/DenoiseNode.js index 70ef3f6299e75c..bca343f0184ec7 100644 --- a/src/nodes/display/DenoiseNode.js +++ b/src/nodes/display/DenoiseNode.js @@ -191,7 +191,7 @@ function generateDenoiseSamples( numSamples, numRings, radiusExponent ) { } -export const denoise = ( node, depthNode, normalNode, noiseNode, camera ) => nodeObject( new DenoiseNode( nodeObject( node ).toTexture(), nodeObject( depthNode ), nodeObject( normalNode ), nodeObject( noiseNode ), camera ) ); +export const denoise = ( node, depthNode, normalNode, noiseNode, camera ) => nodeObject( new DenoiseNode( nodeObject( node ).toTexture(), nodeObject( depthNode ).toTexture(), nodeObject( normalNode ).toTexture(), nodeObject( noiseNode ).toTexture(), camera ) ); addNodeElement( 'denoise', denoise ); From 6adc8a7faffef2726b153ae9f4844dd04fca6109 Mon Sep 17 00:00:00 2001 From: sunag Date: Sat, 20 Jul 2024 03:18:42 -0300 Subject: [PATCH 15/17] cleanup --- src/nodes/display/AfterImageNode.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/nodes/display/AfterImageNode.js b/src/nodes/display/AfterImageNode.js index 32325c85e56326..613758e09de083 100644 --- a/src/nodes/display/AfterImageNode.js +++ b/src/nodes/display/AfterImageNode.js @@ -2,7 +2,6 @@ import TempNode from '../core/TempNode.js'; import { nodeObject, addNodeElement, tslFn, float, vec4 } from '../shadernode/ShaderNode.js'; import { NodeUpdateType } from '../core/constants.js'; import { uv } from '../accessors/UVNode.js'; -import { after } from '../utils/AfterNode.js' import { texture } from '../accessors/TextureNode.js'; import { uniform } from '../core/UniformNode.js'; import { sign, max } from '../math/MathNode.js'; From 3f41fc51f90d9071d9b2a40d1b2b5c7ade442ad5 Mon Sep 17 00:00:00 2001 From: sunag Date: Sat, 20 Jul 2024 03:19:52 -0300 Subject: [PATCH 16/17] cleanup --- examples/webgpu_postprocessing_ao_advanced.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/webgpu_postprocessing_ao_advanced.html b/examples/webgpu_postprocessing_ao_advanced.html index 7f4c1edfa74e38..975d29b7eda014 100644 --- a/examples/webgpu_postprocessing_ao_advanced.html +++ b/examples/webgpu_postprocessing_ao_advanced.html @@ -33,7 +33,7 @@ let camera, scene, renderer, postProcessing, controls, clock, stats, mixer; - let aoPass, denoisePass, blendPassAO, blendPassDenoise, scenePassColor, aoIntensity; + let aoPass, denoisePass, aoIntensity; let handler; const params = { From ecd527e85d590f53f909ba4302eb67cd0b7a6bfd Mon Sep 17 00:00:00 2001 From: sunag Date: Sat, 20 Jul 2024 03:28:02 -0300 Subject: [PATCH 17/17] revert --- src/nodes/display/AfterImageNode.js | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/nodes/display/AfterImageNode.js b/src/nodes/display/AfterImageNode.js index 613758e09de083..f5c040780f6f60 100644 --- a/src/nodes/display/AfterImageNode.js +++ b/src/nodes/display/AfterImageNode.js @@ -3,13 +3,13 @@ import { nodeObject, addNodeElement, tslFn, float, vec4 } from '../shadernode/Sh import { NodeUpdateType } from '../core/constants.js'; import { uv } from '../accessors/UVNode.js'; import { texture } from '../accessors/TextureNode.js'; +import { passTexture } from './PassNode.js'; import { uniform } from '../core/UniformNode.js'; import { sign, max } from '../math/MathNode.js'; import QuadMesh from '../../renderers/common/QuadMesh.js'; import { Vector2 } from '../../math/Vector2.js'; import { RenderTarget } from '../../core/RenderTarget.js'; -import { viewportTopLeft } from './ViewportNode.js'; const _size = /*@__PURE__*/ new Vector2(); @@ -31,7 +31,7 @@ class AfterImageNode extends TempNode { this._oldRT = new RenderTarget(); this._oldRT.texture.name = 'AfterImageNode.old'; - this._textureNode = texture( this._compRT.texture, viewportTopLeft ).before( this ); + this._textureNode = passTexture( this, this._compRT.texture ); this.updateBeforeType = NodeUpdateType.RENDER; @@ -149,4 +149,3 @@ export const afterImage = ( node, damp ) => nodeObject( new AfterImageNode( node addNodeElement( 'afterImage', afterImage ); export default AfterImageNode; -