diff --git a/examples/jsm/tsl/display/GTAONode.js b/examples/jsm/tsl/display/GTAONode.js index a159f302d81a33..50e5f242e56727 100644 --- a/examples/jsm/tsl/display/GTAONode.js +++ b/examples/jsm/tsl/display/GTAONode.js @@ -25,8 +25,9 @@ let _rendererState; * const scenePassDepth = scenePass.getTextureNode( 'depth' ); * * const aoPass = ao( scenePassDepth, scenePassNormal, camera ); + * const aoPassOutput = aoPass.getTextureNode(); * - * renderPipeline.outputNode = aoPass.getTextureNode().mul( scenePassColor ); + * renderPipeline.outputNode = scenePassColor.mul( vec4( vec3( aoPassOutput.r ), 1 ) ); * ``` * * Reference: [Practical Real-Time Strategies for Accurate Indirect Occlusion](https://www.activision.com/cdn/research/Practical_Real_Time_Strategies_for_Accurate_Indirect_Occlusion_NEW%20VERSION_COLOR.pdf). diff --git a/src/nodes/core/NodeBuilder.js b/src/nodes/core/NodeBuilder.js index b76a701ad00693..ff93d5440ad6f0 100644 --- a/src/nodes/core/NodeBuilder.js +++ b/src/nodes/core/NodeBuilder.js @@ -2672,11 +2672,12 @@ class NodeBuilder { * Returns the variable definitions as a shader string for the given shader stage. * * @param {('vertex'|'fragment'|'compute'|'any')} shaderStage - The shader stage. + * @param {boolean} [global=false] - Whether the variables are global. * @return {string} The variable code section. */ - getVars( shaderStage ) { + getVars( shaderStage, global = false ) { - let snippet = ''; + const snippets = []; const vars = this.vars[ shaderStage ]; @@ -2684,13 +2685,13 @@ class NodeBuilder { for ( const variable of vars ) { - snippet += `${ this.getVar( variable.type, variable.name ) }; `; + snippets.push( `${ this.getVar( variable.type, variable.name, variable.count ) };` ); } } - return snippet; + return snippets.join( global ? '\n' : '\n\t' ); } diff --git a/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js b/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js index 98fdf8702719f8..c9971dbaf02a5c 100644 --- a/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +++ b/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js @@ -665,32 +665,6 @@ ${ flowData.code } } - /** - * Returns the variables of the given shader stage as a GLSL string. - * - * @param {string} shaderStage - The shader stage. - * @return {string} The GLSL snippet that defines the variables. - */ - getVars( shaderStage ) { - - const snippets = []; - - const vars = this.vars[ shaderStage ]; - - if ( vars !== undefined ) { - - for ( const variable of vars ) { - - snippets.push( `${ this.getVar( variable.type, variable.name, variable.count ) };` ); - - } - - } - - return snippets.join( '\n\t' ); - - } - /** * Returns the uniforms of the given shader stage as a GLSL string. * @@ -1425,14 +1399,14 @@ ${shaderData.varyings} // attributes ${shaderData.attributes} +// vars +${shaderData.vars} + // codes ${shaderData.codes} void main() { - // vars - ${shaderData.vars} - // transforms ${shaderData.transforms} @@ -1474,14 +1448,14 @@ ${shaderData.uniforms} // varyings ${shaderData.varyings} +// vars +${shaderData.vars} + // codes ${shaderData.codes} void main() { - // vars - ${shaderData.vars} - // flow ${shaderData.flow} @@ -1552,7 +1526,7 @@ void main() { stageData.uniforms = this.getUniforms( shaderStage ); stageData.attributes = this.getAttributes( shaderStage ); stageData.varyings = this.getVaryings( shaderStage ); - stageData.vars = this.getVars( shaderStage ); + stageData.vars = this.getVars( shaderStage, true ); stageData.structs = this.getStructs( shaderStage ); stageData.codes = this.getCodes( shaderStage ); stageData.transforms = this.getTransforms( shaderStage ); diff --git a/src/renderers/webgpu/nodes/WGSLNodeBuilder.js b/src/renderers/webgpu/nodes/WGSLNodeBuilder.js index 7a196ffe585b37..83536500f26ac7 100644 --- a/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +++ b/src/renderers/webgpu/nodes/WGSLNodeBuilder.js @@ -1741,11 +1741,12 @@ ${ flowData.code } * @param {string} type - The variable's type. * @param {string} name - The variable's name. * @param {?number} [count=null] - The array length. + * @param {string} [qualifier=''] - The variable's qualifier. * @return {string} The WGSL snippet that defines a variable. */ - getVar( type, name, count = null ) { + getVar( type, name, count = null, qualifier = '' ) { - let snippet = `var ${ name } : `; + let snippet = `var${ qualifier } ${ name } : `; if ( count !== null ) { @@ -1767,7 +1768,15 @@ ${ flowData.code } * @param {string} shaderStage - The shader stage. * @return {string} The WGSL snippet that defines the variables. */ - getVars( shaderStage ) { + getVars( shaderStage, global = false ) { + + let qualifier = ''; + + if ( global ) { + + qualifier = ''; + + } const snippets = []; const vars = this.vars[ shaderStage ]; @@ -1776,13 +1785,13 @@ ${ flowData.code } for ( const variable of vars ) { - snippets.push( `\t${ this.getVar( variable.type, variable.name, variable.count ) };` ); + snippets.push( `${ this.getVar( variable.type, variable.name, variable.count, qualifier ) };` ); } } - return `\n${ snippets.join( '\n' ) }\n`; + return global ? snippets.join( '\n' ) : `\n\t${ snippets.join( '\n\t' ) }\n`; } @@ -2077,7 +2086,7 @@ ${ flowData.code } stageData.attributes = this.getAttributes( shaderStage ); stageData.varyings = this.getVaryings( shaderStage ); stageData.structs = this.getStructs( shaderStage ); - stageData.vars = this.getVars( shaderStage ); + stageData.vars = this.getVars( shaderStage, true ); stageData.codes = this.getCodes( shaderStage ); stageData.directives = this.getDirectives( shaderStage ); stageData.scopedArrays = this.getScopedArrays( shaderStage ); @@ -2352,15 +2361,15 @@ ${shaderData.uniforms} ${shaderData.varyings} var varyings : VaryingsStruct; +// vars +${shaderData.vars} + // codes ${shaderData.codes} @vertex fn main( ${shaderData.attributes} ) -> VaryingsStruct { - // vars - ${shaderData.vars} - // flow ${shaderData.flow} @@ -2390,15 +2399,15 @@ ${shaderData.structs} // uniforms ${shaderData.uniforms} +// vars +${shaderData.vars} + // codes ${shaderData.codes} @fragment fn main( ${shaderData.varyings} ) -> ${shaderData.returnType} { - // vars - ${shaderData.vars} - // flow ${shaderData.flow} @@ -2435,6 +2444,9 @@ ${ shaderData.structs } // uniforms ${ shaderData.uniforms } +// vars +${ shaderData.vars } + // codes ${ shaderData.codes } @@ -2446,9 +2458,6 @@ fn main( ${ shaderData.attributes } ) { + globalId.y * ( ${ workgroupSizeX } * numWorkgroups.x ) + globalId.z * ( ${ workgroupSizeX } * numWorkgroups.x ) * ( ${ workgroupSizeY } * numWorkgroups.y ); - // vars - ${ shaderData.vars } - // flow ${ shaderData.flow }