Getting custom primvars to work inside materials/shaders

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
        }
    }
}