PixarAnimationStudios / OpenUSD

Universal Scene Description
http://www.openusd.org
Other
5.45k stars 1.13k forks source link

shader variant selection causes new mesh instantiation #3066

Open carsonbrownlee opened 2 weeks ago

carsonbrownlee commented 2 weeks ago

Description of Issue

It seems that changing variant sets over shader params causes meshes connected to that material to be re-instantiated and thus rebuilt as dirty bits are then reset. This works, but adds uneccesary time to reload the mesh. Is this expected behavior with the way I am specifying the variant sets? How can I get around this? Changing the connectToSource of the material's shader implementation appears to have the same behavior. Changing the param values in code manually during runtime appears to work as expected, where Material::Sync() is called but not for the mesh.

Steps to Reproduce

  1. put traces into hdEmbreeMesh::new().
  2. run usdview --renderer hdEmbree
  3. swap variant sets on the shader

simple test scene:

usda 1.0

()

def Xform "root" ( apiSchemas = ["MaterialBindingAPI"] ) { def Cube "cube" ( apiSchemas = ["MaterialBindingAPI"] ) { rel material:binding = </root/cube/mat/material1> def "mat" { def Material "material1" { token outputs:surface.connect = </root/cube/mat/material1/shader1.outputs:surface> def Shader "shader1" ( variants = { string shading = "blue" } prepend variantSets = "shading" ) { uniform token info:id = "UsdPreviewSurface" token outputs:surface variantSet "shading" = { "red" { color3f inputs:diffuseColor = (1, 0, 0) } "blue" { color3f inputs:diffuseColor = (0, 0, 1) } } } } } } }

System Information (OS, Hardware)

Ubuntu 22.04

Package Versions

tested on USD 23.08 and 24.05

Build Flags

USD/build_scripts/build_usd.py --usd-imaging --embree --openvdb --openimageio

jesschimein commented 2 weeks ago

Filed as internal issue #USD-9611