From e0c20484c4cde3d13109413c7b6104388c07f8fd Mon Sep 17 00:00:00 2001 From: RenaudRohlinger Date: Fri, 24 Jul 2026 08:04:24 +0900 Subject: [PATCH] WebGPURenderer: Preserve material side during async compilation --- .../screenshots/webgpu_loader_materialx.jpg | Bin 36149 -> 36240 bytes src/nodes/core/NodeBuilder.js | 8 +++ src/nodes/display/FrontFacingNode.js | 12 ++-- src/nodes/functions/PhysicalLightingModel.js | 4 +- src/renderers/common/RenderObject.js | 13 +++- src/renderers/common/RenderObjects.js | 1 + src/renderers/common/Renderer.js | 64 +++++------------- src/renderers/common/nodes/NodeManager.js | 1 + src/renderers/webgpu/WebGPUBackend.js | 10 +-- .../webgpu/utils/WebGPUPipelineUtils.js | 16 ++--- 10 files changed, 56 insertions(+), 73 deletions(-) diff --git a/examples/screenshots/webgpu_loader_materialx.jpg b/examples/screenshots/webgpu_loader_materialx.jpg index a9d673b5c779ccb02c35924f4e46e074c62320e0..b59a913370e6cd1927df3268602479a946bd8983 100644 GIT binary patch delta 34647 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 ZO#n$i5yAepZ~E##^cA29C;*@j|JgY|DjWa+ delta 34610 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 diff --git a/src/nodes/core/NodeBuilder.js b/src/nodes/core/NodeBuilder.js index d37e05c8f99598..539464bd0a8c43 100644 --- a/src/nodes/core/NodeBuilder.js +++ b/src/nodes/core/NodeBuilder.js @@ -116,6 +116,14 @@ class NodeBuilder { */ this.material = ( object && object.material ) || null; + /** + * The material's side the shader is built for. Nodes must use this property instead + * of `material.side` which is temporarily overwritten for the back side pass. + * + * @type {?number} + */ + this.materialSide = this.material !== null ? this.material.side : null; + /** * The geometry of the 3D object. * diff --git a/src/nodes/display/FrontFacingNode.js b/src/nodes/display/FrontFacingNode.js index c411c530fba65b..8cb8b3fefbf734 100644 --- a/src/nodes/display/FrontFacingNode.js +++ b/src/nodes/display/FrontFacingNode.js @@ -41,9 +41,7 @@ class FrontFacingNode extends Node { // - const { material } = builder; - - if ( material.side === BackSide ) { + if ( builder.materialSide === BackSide ) { return 'false'; @@ -88,15 +86,13 @@ export const faceDirection = /*@__PURE__*/ float( frontFacing ).mul( 2.0 ).sub( * @param {Node} vector - The vector to process. * @returns {Node} The processed vector. */ -export const negateOnBackSide = /*@__PURE__*/ Fn( ( [ vector ], { material } ) => { - - const side = material.side; +export const negateOnBackSide = /*@__PURE__*/ Fn( ( [ vector ], { materialSide } ) => { - if ( side === BackSide ) { + if ( materialSide === BackSide ) { vector = vector.mul( - 1.0 ); - } else if ( side === DoubleSide ) { + } else if ( materialSide === DoubleSide ) { vector = vector.mul( faceDirection ); diff --git a/src/nodes/functions/PhysicalLightingModel.js b/src/nodes/functions/PhysicalLightingModel.js index 4e2567f4b300cb..9052e922cf10c7 100644 --- a/src/nodes/functions/PhysicalLightingModel.js +++ b/src/nodes/functions/PhysicalLightingModel.js @@ -70,9 +70,9 @@ const applyIorToRoughness = /*@__PURE__*/ Fn( ( [ roughness, ior ] ) => { const viewportBackSideTexture = /*@__PURE__*/ viewportMipTexture(); const viewportFrontSideTexture = /*@__PURE__*/ viewportOpaqueMipTexture(); -const getTransmissionSample = /*@__PURE__*/ Fn( ( [ fragCoord, roughness, ior ], { material } ) => { +const getTransmissionSample = /*@__PURE__*/ Fn( ( [ fragCoord, roughness, ior ], { materialSide } ) => { - const vTexture = material.side === BackSide ? viewportBackSideTexture : viewportFrontSideTexture; + const vTexture = materialSide === BackSide ? viewportBackSideTexture : viewportFrontSideTexture; const transmissionSample = vTexture.sample( fragCoord ); //const transmissionSample = viewportMipTexture( fragCoord ); diff --git a/src/renderers/common/RenderObject.js b/src/renderers/common/RenderObject.js index c900fa4c9654f8..a3ae1c657a3cfa 100644 --- a/src/renderers/common/RenderObject.js +++ b/src/renderers/common/RenderObject.js @@ -119,6 +119,15 @@ class RenderObject { */ this.material = material; + /** + * The material's side this render object is rendered with. Since render objects are + * unique per pass (see the `backSide` pass ID), this preserves the side of the back + * side pass when `material.side` has already been restored. + * + * @type {number} + */ + this.materialSide = material.side; + /** * The scene the 3D object belongs to. * @@ -752,9 +761,9 @@ class RenderObject { if ( property === 'side' ) { // `side` is an enum (FrontSide/BackSide/DoubleSide) that changes code - // generation, so its exact value must be preserved. + // generation, so the exact side of this render object must be preserved. - valueKey = String( value ); + valueKey = String( this.materialSide ); } else { diff --git a/src/renderers/common/RenderObjects.js b/src/renderers/common/RenderObjects.js index 676cc2bd416942..6a1c3c08ad800a 100644 --- a/src/renderers/common/RenderObjects.js +++ b/src/renderers/common/RenderObjects.js @@ -113,6 +113,7 @@ class RenderObjects { // update references renderObject.camera = camera; + renderObject.materialSide = material.side; // diff --git a/src/renderers/common/Renderer.js b/src/renderers/common/Renderer.js index 937f15389a32be..4855e957889230 100644 --- a/src/renderers/common/Renderer.js +++ b/src/renderers/common/Renderer.js @@ -653,13 +653,13 @@ class Renderer { this._initPromise = null; /** - * An array of compilation promises which are used in `compileAsync()`. + * An array of render objects which are precompiled in `compileAsync()`. * * @private - * @type {?Array} + * @type {?Array} * @default null */ - this._compilationPromises = null; + this._compilationRenderObjects = null; /** * Whether the renderer is currently precompiling a render object in @@ -921,7 +921,7 @@ class Renderer { const previousRenderContext = this._currentRenderContext; const previousRenderObjectFunction = this._currentRenderObjectFunction; const previousHandleObjectFunction = this._handleObjectFunction; - const previousCompilationPromises = this._compilationPromises; + const previousCompilationRenderObjects = this._compilationRenderObjects; // @@ -939,14 +939,14 @@ class Renderer { const renderContext = this._renderContexts.get( renderTarget, this._mrt ); const activeMipmapLevel = this._activeMipmapLevel; - const compilationPromises = []; + const compilationRenderObjects = []; this._currentRenderContext = renderContext; this._currentRenderObjectFunction = this.renderObject; this._handleObjectFunction = this._createObjectPipeline; - this._compilationPromises = compilationPromises; + this._compilationRenderObjects = compilationRenderObjects; nodeFrame.renderId ++; @@ -1039,7 +1039,7 @@ class Renderer { } - // process render lists - _createObjectPipeline will push async promises to _compilationPromises + // process render lists - _createObjectPipeline will push render objects to _compilationRenderObjects const opaqueObjects = renderList.opaque; const transparentObjects = renderList.transparent; @@ -1056,19 +1056,15 @@ class Renderer { this._currentRenderContext = previousRenderContext; this._currentRenderObjectFunction = previousRenderObjectFunction; this._handleObjectFunction = previousHandleObjectFunction; - this._compilationPromises = previousCompilationPromises; + this._compilationRenderObjects = previousCompilationRenderObjects; // Process compilation work items sequentially to avoid freezing // Yields between objects to keep animation smooth - const total = compilationPromises.length; + const total = compilationRenderObjects.length; let loaded = 0; - for ( const item of compilationPromises ) { - - const renderObject = this._objects.get( item.object, item.material, item.scene, item.camera, item.lightsNode, item.renderContext, item.clippingContext, item.passId ); - renderObject.drawRange = item.object.geometry.drawRange; - renderObject.group = item.group; + for ( const renderObject of compilationRenderObjects ) { // Use async node building to yield to main thread await this._nodes.getForRenderAsync( renderObject ); @@ -1083,6 +1079,7 @@ class Renderer { // Wait for pipeline creation const pipelinePromises = []; this._pipelines.getForRender( renderObject, pipelinePromises ); + if ( pipelinePromises.length > 0 ) { await Promise.all( pipelinePromises ); @@ -3891,8 +3888,8 @@ class Renderer { } /** - * A different implementation for `_handleObjectFunction` which only makes sure the object is ready for rendering. - * Used in `compileAsync()`. + * A different implementation for `_handleObjectFunction` which collects the render objects + * that are precompiled in `compileAsync()` instead of rendering them. * * @private * @param {Object3D} object - The 3D object. @@ -3906,43 +3903,14 @@ class Renderer { */ _createObjectPipeline( object, material, scene, camera, lightsNode, group, clippingContext, passId ) { - // If in async compilation mode, queue the work for sequential execution - if ( this._compilationPromises !== null ) { - - // Store work items instead of promises - will be processed sequentially - this._compilationPromises.push( { - object, - material, - scene, - camera, - lightsNode, - group, - clippingContext, - passId, - renderContext: this._currentRenderContext - } ); - - return; + // the render object must be requested during the traversal since `material.side` is + // temporarily overwritten for the back side pass, see `RenderObject.materialSide` - } - - // Sync path const renderObject = this._objects.get( object, material, scene, camera, lightsNode, this._currentRenderContext, clippingContext, passId ); renderObject.drawRange = object.geometry.drawRange; renderObject.group = group; - // - - this._nodes.updateBefore( renderObject ); - - this._geometries.updateForRender( renderObject ); - - this._nodes.updateForRender( renderObject ); - this._bindings.updateForRender( renderObject ); - - this._pipelines.getForRender( renderObject, this._compilationPromises ); - - this._nodes.updateAfter( renderObject ); + this._compilationRenderObjects.push( renderObject ); } diff --git a/src/renderers/common/nodes/NodeManager.js b/src/renderers/common/nodes/NodeManager.js index 0b5faf6a111e1c..f1a85b20eeead0 100644 --- a/src/renderers/common/nodes/NodeManager.js +++ b/src/renderers/common/nodes/NodeManager.js @@ -171,6 +171,7 @@ class NodeManager extends DataMap { nodeBuilder.scene = renderObject.scene; nodeBuilder.material = material; + nodeBuilder.materialSide = renderObject.materialSide; nodeBuilder.camera = renderObject.camera; nodeBuilder.context.material = material; nodeBuilder.lightsNode = renderObject.lightsNode; diff --git a/src/renderers/webgpu/WebGPUBackend.js b/src/renderers/webgpu/WebGPUBackend.js index 3a3c6f0fe1f99d..4e896ef89a3c98 100644 --- a/src/renderers/webgpu/WebGPUBackend.js +++ b/src/renderers/webgpu/WebGPUBackend.js @@ -2087,7 +2087,7 @@ class WebGPUBackend extends Backend { const data = this.get( renderObject ); - const { object, material } = renderObject; + const { object, material, materialSide } = renderObject; const utils = this.utils; @@ -2108,7 +2108,7 @@ class WebGPUBackend extends Backend { data.stencilWrite !== material.stencilWrite || data.stencilFunc !== material.stencilFunc || data.stencilFail !== material.stencilFail || data.stencilZFail !== material.stencilZFail || data.stencilZPass !== material.stencilZPass || data.stencilFuncMask !== material.stencilFuncMask || data.stencilWriteMask !== material.stencilWriteMask || - data.side !== material.side || data.alphaToCoverage !== material.alphaToCoverage || + data.side !== materialSide || data.alphaToCoverage !== material.alphaToCoverage || data.sampleCount !== sampleCount || data.colorSpace !== colorSpace || data.colorFormat !== colorFormat || data.depthStencilFormat !== depthStencilFormat || data.primitiveTopology !== primitiveTopology || @@ -2125,7 +2125,7 @@ class WebGPUBackend extends Backend { data.stencilWrite = material.stencilWrite; data.stencilFunc = material.stencilFunc; data.stencilFail = material.stencilFail; data.stencilZFail = material.stencilZFail; data.stencilZPass = material.stencilZPass; data.stencilFuncMask = material.stencilFuncMask; data.stencilWriteMask = material.stencilWriteMask; - data.side = material.side; data.alphaToCoverage = material.alphaToCoverage; + data.side = materialSide; data.alphaToCoverage = material.alphaToCoverage; data.sampleCount = sampleCount; data.colorSpace = colorSpace; data.colorFormat = colorFormat; @@ -2150,7 +2150,7 @@ class WebGPUBackend extends Backend { */ getRenderCacheKey( renderObject ) { - const { object, material } = renderObject; + const { object, material, materialSide } = renderObject; const utils = this.utils; const renderContext = renderObject.context; @@ -2169,7 +2169,7 @@ class WebGPUBackend extends Backend { material.stencilWrite, material.stencilFunc, material.stencilFail, material.stencilZFail, material.stencilZPass, material.stencilFuncMask, material.stencilWriteMask, - material.side, + materialSide, frontFaceCW, utils.getSampleCountRenderContext( renderContext ), utils.getCurrentColorSpace( renderContext ), utils.getCurrentColorFormat( renderContext ), utils.getCurrentDepthStencilFormat( renderContext ), diff --git a/src/renderers/webgpu/utils/WebGPUPipelineUtils.js b/src/renderers/webgpu/utils/WebGPUPipelineUtils.js index 0e130371451f47..2c965383f758bb 100644 --- a/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +++ b/src/renderers/webgpu/utils/WebGPUPipelineUtils.js @@ -71,7 +71,7 @@ class WebGPUPipelineUtils { */ createRenderPipeline( renderObject, promises ) { - const { object, material, geometry, pipeline } = renderObject; + const { material, pipeline } = renderObject; const { vertexProgram, fragmentProgram } = pipeline; const backend = this.backend; @@ -193,7 +193,7 @@ class WebGPUPipelineUtils { const vertexModule = backend.get( vertexProgram ).module; const fragmentModule = backend.get( fragmentProgram ).module; - const primitiveState = this._getPrimitiveState( object, geometry, material ); + const primitiveState = this._getPrimitiveState( renderObject ); const depthCompare = this._getDepthCompare( material ); const depthStencilFormat = utils.getCurrentDepthStencilFormat( renderObject.context ); @@ -888,12 +888,12 @@ class WebGPUPipelineUtils { * for the pipeline creation. * * @private - * @param {Object3D} object - The 3D object. - * @param {BufferGeometry} geometry - The geometry. - * @param {Material} material - The material. + * @param {RenderObject} renderObject - The render object. * @return {Object} The primitive state. */ - _getPrimitiveState( object, geometry, material ) { + _getPrimitiveState( renderObject ) { + + const { object, geometry, material, materialSide } = renderObject; const descriptor = {}; const utils = this.backend.utils; @@ -910,7 +910,7 @@ class WebGPUPipelineUtils { // - let flipSided = ( material.side === BackSide ); + let flipSided = ( materialSide === BackSide ); if ( object.isMesh && object.matrixWorld.determinantAffine() < 0 ) flipSided = ! flipSided; @@ -918,7 +918,7 @@ class WebGPUPipelineUtils { // - descriptor.cullMode = ( material.side === DoubleSide ) ? GPUCullMode.None : GPUCullMode.Back; + descriptor.cullMode = ( materialSide === DoubleSide ) ? GPUCullMode.None : GPUCullMode.Back; return descriptor;