From f2d15d4fd19aba23b9432b4f31488336b2214eba Mon Sep 17 00:00:00 2001 From: Michael Kowalski <makowalski@nvidia.com> Date: Fri, 10 Nov 2023 19:57:34 -0500 Subject: [PATCH] Fix: USD: Wrong UsdUVTexture rgb output type. This fixes a bug where the rgb UsdUVTexture shader output attributes were created with incorrect type color3f when connected to UsdPreviewSurface diffuseColor and emissiveColor inputs. The UsdPreviewSurface specification requires the UsdUVTexture rgb output to be of type float3. This was happening because the UsdUVTexture outputs were created implicitly by the call to UsdShadeInput::ConnectToSource(). I.e., because the diffuseColor and emissiveColor inputs are of type color3f, this was the type assigned by default to the rgb source attributes as well. Now explicitly creating the UsdUVTexture shader output attributes with the correct types. Pull Request: https://projects.blender.org/blender/blender/pulls/114728 --- source/blender/io/usd/intern/usd_writer_material.cc | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/source/blender/io/usd/intern/usd_writer_material.cc b/source/blender/io/usd/intern/usd_writer_material.cc index e683a24ca12..cf8b22c7eef 100644 --- a/source/blender/io/usd/intern/usd_writer_material.cc +++ b/source/blender/io/usd/intern/usd_writer_material.cc @@ -174,16 +174,17 @@ static void create_usd_preview_surface_material(const USDExporterContext &usd_ex pxr::UsdShadeShader usd_shader = create_usd_preview_shader( usd_export_context, usd_material, input_node); - /* Determine the name of the USD texture node attribute that should be - * connected to this input. */ + /* Create the UsdUVTexture node output attribute that should be connected to this input. */ pxr::TfToken source_name; if (input_spec.input_type == pxr::SdfValueTypeNames->Float) { /* If the input is a float, we connect it to either the texture alpha or red channels. */ source_name = STREQ(input_link->fromsock->identifier, "Alpha") ? usdtokens::a : usdtokens::r; + usd_shader.CreateOutput(source_name, pxr::SdfValueTypeNames->Float); } else { source_name = usdtokens::rgb; + usd_shader.CreateOutput(usdtokens::rgb, pxr::SdfValueTypeNames->Float3); } /* Create the preview surface input and connect it to the shader. */ -- GitLab