From 585b578fb735485a95b651ff9d9e001601d3090f Mon Sep 17 00:00:00 2001 From: "Mr.doob" Date: Sat, 7 Feb 2026 07:47:53 +0900 Subject: [PATCH] USDLoader: Apply UsdUVTexture scale to material colors The UsdUVTexture inputs:scale was being stored but not applied to material color properties, causing textures with color-encoded scales (e.g. blue tint via scale) to render as white. Co-Authored-By: Claude Opus 4.6 --- examples/jsm/loaders/usd/USDComposer.js | 51 ++++++++++++++++++++++++- 1 file changed, 50 insertions(+), 1 deletion(-) diff --git a/examples/jsm/loaders/usd/USDComposer.js b/examples/jsm/loaders/usd/USDComposer.js index b35162de80dceb..4a20de859bae82 100644 --- a/examples/jsm/loaders/usd/USDComposer.js +++ b/examples/jsm/loaders/usd/USDComposer.js @@ -2524,6 +2524,18 @@ class USDComposer { } ); + // Apply UsdUVTexture scale to diffuse color (output = texture * scale + bias) + if ( material.map && material.map.userData.scale ) { + + const scale = material.map.userData.scale; + if ( Array.isArray( scale ) && scale.length >= 3 ) { + + material.color.setRGB( scale[ 0 ], scale[ 1 ], scale[ 2 ], SRGBColorSpace ); + + } + + } + // Emissive applyTexture( 'inputs:emissiveColor', @@ -2542,7 +2554,20 @@ class USDComposer { if ( material.emissiveMap ) { - material.emissive.set( 0xffffff ); + if ( material.emissiveMap.userData.scale ) { + + const scale = material.emissiveMap.userData.scale; + if ( Array.isArray( scale ) && scale.length >= 3 ) { + + material.emissive.setRGB( scale[ 0 ], scale[ 1 ], scale[ 2 ], SRGBColorSpace ); + + } + + } else { + + material.emissive.set( 0xffffff ); + + } } @@ -2620,6 +2645,18 @@ class USDComposer { } ); + // Apply UsdUVTexture scale to specular color + if ( material.specularColorMap && material.specularColorMap.userData.scale ) { + + const scale = material.specularColorMap.userData.scale; + if ( Array.isArray( scale ) && scale.length >= 3 ) { + + material.specularColor.setRGB( scale[ 0 ], scale[ 1 ], scale[ 2 ], SRGBColorSpace ); + + } + + } + // Clearcoat if ( fields[ 'inputs:clearcoat' ] !== undefined ) { @@ -2702,6 +2739,18 @@ class USDComposer { } ); + // Apply UsdUVTexture scale to base color + if ( material.map && material.map.userData.scale ) { + + const scale = material.map.userData.scale; + if ( Array.isArray( scale ) && scale.length >= 3 ) { + + material.color.setRGB( scale[ 0 ], scale[ 1 ], scale[ 2 ], SRGBColorSpace ); + + } + + } + // Base metalness applyTexture( 'inputs:base_metalness',