Browse Source

WebGPURenderer: fix rendering to depth textures with multiple color attachments (MRT - WGSL) (#28523)

* handle mrt with depth

* rename builder method

---------

Co-authored-by: aardgoose <[email protected]>
aardgoose 1 year ago
parent
commit
71f8579e56

+ 1 - 5
examples/jsm/nodes/core/OutputStructNode.js

@@ -33,11 +33,7 @@ class OutputStructNode extends Node {
 
 
 	generate( builder, output ) {
 	generate( builder, output ) {
 
 
-		const nodeVar = builder.getVarFromNode( this );
-		nodeVar.isOutputStructVar = true;
-
-		const propertyName = builder.getPropertyName( nodeVar );
-
+		const propertyName = builder.getOutputStructName();
 		const members = this.members;
 		const members = this.members;
 
 
 		const structPrefix = propertyName !== '' ? propertyName + '.' : '';
 		const structPrefix = propertyName !== '' ? propertyName + '.' : '';

+ 6 - 4
examples/jsm/renderers/webgl/nodes/GLSLNodeBuilder.js

@@ -51,12 +51,16 @@ class GLSLNodeBuilder extends NodeBuilder {
 
 
 	getPropertyName( node, shaderStage ) {
 	getPropertyName( node, shaderStage ) {
 
 
-		if ( node.isOutputStructVar ) return '';
-
 		return super.getPropertyName( node, shaderStage );
 		return super.getPropertyName( node, shaderStage );
 
 
 	}
 	}
 
 
+	getOutputStructName() {
+
+		return '';
+
+	}
+
 	buildFunctionCode( shaderNode ) {
 	buildFunctionCode( shaderNode ) {
 
 
 		const layout = shaderNode.layout;
 		const layout = shaderNode.layout;
@@ -277,8 +281,6 @@ ${ flowData.code }
 
 
 			for ( const variable of vars ) {
 			for ( const variable of vars ) {
 
 
-				if ( variable.isOutputStructVar ) continue;
-
 				snippets.push( `${ this.getVar( variable.type, variable.name ) };` );
 				snippets.push( `${ this.getVar( variable.type, variable.name ) };` );
 
 
 			}
 			}

+ 12 - 0
examples/jsm/renderers/webgpu/nodes/WGSLNodeBuilder.js

@@ -338,6 +338,12 @@ class WGSLNodeBuilder extends NodeBuilder {
 
 
 	}
 	}
 
 
+	getOutputStructName() {
+
+		return 'output';
+
+	}
+
 	_getUniformGroupCount( shaderStage ) {
 	_getUniformGroupCount( shaderStage ) {
 
 
 		return Object.keys( this.uniforms[ shaderStage ] ).length;
 		return Object.keys( this.uniforms[ shaderStage ] ).length;
@@ -659,6 +665,10 @@ ${ flowData.code }
 
 
 		}
 		}
 
 
+		const builtins = this.getBuiltins( 'output' );
+
+		if ( builtins ) snippets.push( builtins );
+
 		return snippets.join( ',\n' );
 		return snippets.join( ',\n' );
 
 
 	}
 	}
@@ -679,6 +689,8 @@ ${ flowData.code }
 
 
 			snippets.push( snippet );
 			snippets.push( snippet );
 
 
+			snippets.push( `\nvar<private> output : ${ name };\n\n`);
+
 		}
 		}
 
 
 		return snippets.join( '\n\n' );
 		return snippets.join( '\n\n' );