Просмотр исходного кода

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 <noreply@anthropic.com>
Mr.doob 2 недель назад
Родитель
Сommit
585b578fb7
1 измененных файлов с 50 добавлено и 1 удалено
  1. 50 1
      examples/jsm/loaders/usd/USDComposer.js

+ 50 - 1
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',

粤ICP备19079148号