Observed
The converted USD appears noticeably overexposed in usdview compared with the source VRM rendered in a VRM web viewer. The discrepancy is especially visible on the front bangs: their strand-level shading/colour variation is mostly lost and becomes nearly white/yellow.
Reference captures from the report:
- converted USD in usdview:
Expected
The USD should preserve the source VRM's visible material colour variation closely enough that the bangs do not clip to a bright, nearly uniform colour in usdview.
Initial investigation
Two likely contributing gaps are present in the current converter:
- Vertex colour support appears absent. The USD authorer creates normal and
st primvars, but does not author a colour primvar (displayColor / primvars:...), and the reader has no apparent COLOR_0 handling. If this asset uses vertex colours to modulate hair shading, that modulation is currently dropped.
- Unlit materials are represented by putting
baseColor directly into UsdPreviewSurface.inputs:emissiveColor. For textured unlit materials, the base-colour texture replaces that input. The implementation notes that glTF factor x texture multiplication is only approximated, and MToon is retained as metadata rather than mapped to a dedicated graph. This can change energy/colour handling in Hydra/usdview and may explain the blown-out result.
Relevant code:
plugins/usdVrmFileFormat/src/usd/UsdVrmAuthorer.cpp -- unlit base-colour -> emissive conversion and texture connections
plugins/usdVrmFileFormat/src/io/CgltfVrmDocumentReader.cpp -- material import; no COLOR_0 import found
Investigation / acceptance criteria
Notes
The captures make this a renderer-visible discrepancy, but the exact target asset and its source .vrm have not yet been added to the repository. Attach or reference it before implementing the regression fixture.
Observed
The converted USD appears noticeably overexposed in
usdviewcompared with the source VRM rendered in a VRM web viewer. The discrepancy is especially visible on the front bangs: their strand-level shading/colour variation is mostly lost and becomes nearly white/yellow.Reference captures from the report:
Expected
The USD should preserve the source VRM's visible material colour variation closely enough that the bangs do not clip to a bright, nearly uniform colour in
usdview.Initial investigation
Two likely contributing gaps are present in the current converter:
stprimvars, but does not author a colour primvar (displayColor/primvars:...), and the reader has no apparentCOLOR_0handling. If this asset uses vertex colours to modulate hair shading, that modulation is currently dropped.baseColordirectly intoUsdPreviewSurface.inputs:emissiveColor. For textured unlit materials, the base-colour texture replaces that input. The implementation notes that glTF factor x texture multiplication is only approximated, and MToon is retained as metadata rather than mapped to a dedicated graph. This can change energy/colour handling in Hydra/usdview and may explain the blown-out result.Relevant code:
plugins/usdVrmFileFormat/src/usd/UsdVrmAuthorer.cpp-- unlit base-colour -> emissive conversion and texture connectionsplugins/usdVrmFileFormat/src/io/CgltfVrmDocumentReader.cpp-- material import; noCOLOR_0import foundInvestigation / acceptance criteria
COLOR_0and determine its interpolation and intended material modulation.usdviewdoes not overdrive emissive output; preserve base-colour factor x texture semantics.Notes
The captures make this a renderer-visible discrepancy, but the exact target asset and its source
.vrmhave not yet been added to the repository. Attach or reference it before implementing the regression fixture.