Thanks for the response and details, @spiff! Well appreciated.
Indeed, I’m trying to get things to work in QuickLook, where such a graph can be authored easily but doesn’t work either (no fallback value and no primvars)… (I reported it to Apple already).
For completeness and to learn more about the differences, I tried to assemble minimal graphs using the native approach (which still renders grey in usdview+Storm for me which I got to work after some trial-and-error):
#usda 1.0
(
defaultPrim = "Root"
metersPerUnit = 1
upAxis = "Y"
)
def Xform "Root"
{
def Sphere "MySphere" (
prepend apiSchemas = ["MaterialBindingAPI"]
)
{
rel material:binding = </Root/MyMaterial>
float3 primvars:myColor = (0, 0, 1) ( interpolation = "constant" ) # overrides the color in the material
double radius = 0.5
}
def Material "MyMaterial"
{
token outputs:surface.connect = <PreviewSurface.outputs:surface>
def Shader "ColorReader"
{
uniform token info:id = "UsdPrimvarReader_float3"
float3 inputs:fallback = (0, 1, 0) # used when primvar not found
string inputs:varname = "myColor"
float3 outputs:out
}
def Shader "PreviewSurface"
{
uniform token info:id = "UsdPreviewSurface"
color3f inputs:diffuseColor = (1, 0, 0) # used when not connected
color3f inputs:diffuseColor.connect = <../ColorReader.outputs:out>
float inputs:metallic = 0
float inputs:roughness = 0.5
token outputs:surface
}
}
}
And the MaterialX ND_ version (this one I can’t get to work, always stays grey):
#usda 1.0
(
defaultPrim = "Root"
metersPerUnit = 1
upAxis = "Y"
)
def Xform "Root"
{
def Sphere "MySphere" (
prepend apiSchemas = ["MaterialBindingAPI"]
)
{
rel material:binding = </Root/MyMaterial>
float3 primvars:myColor = (0, 0, 1) (
interpolation = "constant"
)
double radius = 0.5
}
def Material "MyMaterial"
{
token outputs:mtlx:surface.connect = <PreviewSurface.outputs:surface>
def Shader "ColorReader"
{
uniform token info:id = "ND_UsdPrimvarReader_vector3"
float3 inputs:fallback = (0, 1, 0)
string inputs:varname = "myColor"
float3 outputs:out
}
def Shader "PreviewSurface"
{
uniform token info:id = "ND_UsdPreviewSurface_surfaceshader"
float3 inputs:diffuseColor.connect = </Root/MyMaterial/ColorReader.outputs:out>
float inputs:metallic = 0
float inputs:roughness = 0.5
token outputs:surface
}
}
}
And a geomprop version that I believe should also be equivalent.
This one actually works in usdview+Storm!
(but sadly not in Reality Composer / QuickLook)
#usda 1.0
(
defaultPrim = "Root"
metersPerUnit = 1
upAxis = "Y"
)
def Xform "Root"
{
def Sphere "MySphere" (
prepend apiSchemas = ["MaterialBindingAPI"]
)
{
rel material:binding = </Root/MyMaterial>
float3 primvars:myColor = (0, 0, 1) (
interpolation = "constant"
)
double radius = 0.5
}
def Material "MyMaterial"
{
token outputs:mtlx:surface.connect = <PreviewSurface.outputs:surface>
def Shader "PreviewSurface"
{
uniform token info:id = "ND_UsdPreviewSurface_surfaceshader"
color3f inputs:diffuseColor = (0.18, 1, 0.18)
color3f inputs:diffuseColor.connect = </Root/MyMaterial/Convert.outputs:out>
float inputs:metallic = 0
float3 inputs:normal
float inputs:opacity
float inputs:roughness = 0.5
token outputs:out
token outputs:surface
}
def Shader "GeometricProperty"
{
uniform token info:id = "ND_geompropvalue_vector3"
float3 inputs:default = (0, 1, 0)
string inputs:geomprop = "myColor"
float3 outputs:out
}
def Shader "Convert"
{
uniform token info:id = "ND_convert_vector3_color3"
float3 inputs:in.connect = </Root/MyMaterial/GeometricProperty.outputs:out>
color3f outputs:out
}
}
}