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
This commit is contained in:
Michael Kowalski
2023-11-10 19:57:34 -05:00
committed by Gitea
parent c688b03847
commit f2d15d4fd1

View File

@@ -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. */