Technical reference note

Visual Scenes and Asset Exchange 5 min read

Updated 04 Sep 2026

Build a visual delivery package with an explicit dependency manifest, inspect its path and format behavior, and test it in a clean receiver against approved views and clips.

Package and Test a Visual Scene Handoff

A single file is not automatically a self-contained delivery. A visual scene can depend on sidecar buffers, images, referenced layers, payloads, shader resources, packages, resolver settings, or a receiver-specific feature set. Build a manifest, define the package boundary, and test the actual package in a clean destination context.

Create a dependency manifest

Start with the root scene and list everything required for the intended result:

  • root scene or stage, its version/profile, and any extensions used or required;
  • referenced layers, sublayers, payloads, and selected variants;
  • meshes, instances, prototypes, skins, deformation bindings, transform stacks, and UV data;
  • materials, shader networks, texture images, samplers, and material variants;
  • cameras, lights, animation clips, property-animation targets, visibility states, and any required fonts or media; and
  • external packages, resolver schemes, search paths, licenses, and receiver-side prerequisites.

For every entry, record its relative or external path, expected owner, whether it is embedded or sidecar, and the check that proves it is usable. Include optional resources separately so a missing preview asset is not confused with a missing required texture or animation.

Choose and document the path strategy

glTF represents the scene description in JSON and can use binary buffers and image files. Those resources may be sidecars, embedded as data URIs or buffer views, or placed in a GLB container. A GLB can gather JSON, buffers, and images into one binary blob, but it may still refer to external resources. Inspect the actual URIs and references rather than treating .glb as a universal guarantee of closure.

USD makes the path question more explicit. Asset paths name locations that a resolver validates, normalizes, and resolves. A resolver context can change how a path is interpreted, and a valid path string can remain unresolved on a receiver that lacks the same files, search paths, URI scheme, or context.

USD localization gathers scattered layers into a file tree and retargets references, payloads, and generic asset paths. It is a packaging and path operation, not the same as flattening the composition. A USDZ package can contain USD files, images, textures, and audio, and its first native USD file is the Default Layer when the package is to be staged or referenced as a whole. USDZ is read-only as a package; editing its contents requires unpacking and repackaging.

The manifest must also capture feature and build context. A glTF package that uses KHR_texture_transform, KHR_materials_variants, KHR_lights_punctual, KHR_animation_pointer, or KHR_node_visibility should identify those extensions and whether the receiver must support them. A USD or MaterialX delivery may depend on transform-stack order, value-clip files, UsdSkel relationships, MaterialX specification/library version, shader target, image reader, plugin search path, or color-management configuration. These are dependency conditions, not decorative metadata.

Do not overstate what USDZ includes. The specification allows files inside a package to refer outside it, permits nested packages, and allows resolver-dependent paths. Tools such as usdzip --asset can discover recursively referenced files and retarget paths, but the resulting package still needs inspection under the intended receiver conditions.

Run structural preflight before visual review

For a glTF or GLB delivery, the official Khronos glTF Validator can check the asset against its implemented glTF 2.0 checks. Its report can include JSON and GLB correctness, schema and internal-reference validity, resource checks for buffers and images, animation data conditions, and supported extension checks. Record the validator release or commit and retain the JSON report.

For USD or USDZ, use the relevant package and format utilities, such as package listing, path inspection, and usdchecker where appropriate. A package checker can establish that the package meets the checks it performs. It cannot establish that a renderer supports every feature or that the result matches an approved image.

For extension-bearing glTF, inspect extensionsUsed and extensionsRequired, then validate the actual targets: transformed UV sets, primitive material mappings, light-node attachments and units, JSON Pointer types, and recursive visibility. For USD and MaterialX, inspect transform-operation order, instance/prototype arrays, bindings and custom-node resources, time-sample or clip files, and the pinned version/build conditions before visual review.

Structural preflight answers “does this package satisfy these format and resource checks?” It does not answer “does the receiver produce the required visual result?” Keep those judgments separate.

Test in a clean receiver

Use a test directory, machine, container, or user context that does not accidentally inherit the exporter’s search paths. Then:

  1. Record the source application, release, scene state, active variant, selected representation, and package creation tool.
  2. Inspect the manifest against the files actually delivered. Check case, relative paths, nested packages, sidecars, and external references.
  3. Resolve every required path in the clean receiver. Record missing, substituted, or resolver-dependent resources.
  4. Load the required layers and payloads, select the named variants, and compare hierarchy, transform-operation order/reset state, prototypes and instance arrays, deformation bindings, and object identity.
  5. Open the approved cameras and compare reference frames at the agreed aspect ratio and resolution.
  6. Inspect representative materials, UVs, textures, transparency, lighting, and shadows with the named renderer or runtime.
  7. Play required animation clips and compare selected frames, timing/interpolation, targets, deformation, visibility states, and initial state.
  8. Record receiver version, renderer/runtime, enabled extensions, validator or checker result, deviations, and acceptance decision.

The clean-receiver test is the evidence for this package instance. A package specification, a successful validator run, and a successful initial open are useful separate observations; none replaces the complete test when visual usability matters.

Keep the acceptance record useful

At minimum, retain:

Record Why it matters
Manifest and package hash or equivalent identity Shows exactly which dependency set was tested.
Source and receiver conditions Prevents a result from being generalized across releases or renderers.
Structural preflight report Separates format/resource defects from receiver behavior.
Selected views, clips, variants, and load state Makes the visual comparison reproducible.
Extensions, format/library versions, and build or color-management context Explains feature and appearance conditions that a file alone cannot guarantee.
Observed differences and permitted limits Distinguishes accepted degradation from an unexamined loss.
Final acceptance decision States whether the package serves the declared downstream objective.

If the package fails, classify the failure: missing dependency, unresolved path, unsupported feature, composition difference, appearance mismatch, playback difference, or acceptance failure. A repair that makes the file open does not by itself restore a relationship that was flattened or a feature that the receiver cannot interpret.

Use Scene Graphs, Composition, and Variants for composition choices and Cameras, Lights, and Animation for the viewing-result fixture.