This document serves as my personal study notes. For a more in-depth introduction to USD, visit openUSD.org.
What is USD?
Universal Scene Description (USD) is a framework — and a family of file formats — for describing, storing, and exchanging complete 3D scenes. Rather than only saving geometry, USD can package many parts of a production scene in a structured, scalable way, including geometry and attributes, materials, animation, lighting, cameras, instancing, and render settings. Because it supports both a standardized scene representation and a workflow for assembling and updating assets, USD scenes can be reliably loaded and shared across most professional VFX and 3D software.
Types of data USD can store
- Geometry
- Geometry Attributes
- Materials
- Animation
- Lighting
- Cameras
- Render Settings
- Instances
Why the CG Industry Is Transitioning to USD
USD matters because it makes collaboration on complex 3D work far more practical. Instead of relying on a huge, custom-built pipeline to keep everyone in sync, teams can work on the same shots and sequences with a shared scene description that holds up at production scale.
It's also built for non-destructive workflows. USD keeps scene data "alive" and editable through layered opinions, so changes can be added, overridden, or rolled back without tearing the whole scene apart. That structure makes iteration safer and more predictable — especially when multiple departments are touching the same assets.
Another major advantage is consistency over time. When assets or scene components get updated, those updates can propagate across a shot or even an entire sequence, reducing repeated manual fixes and keeping look and layout aligned.
USD is designed to handle heavy scenes efficiently. It stays performant as projects grow, and it supports smart strategies like variants (multiple versions of the same asset) and payloads (only loading what you need, when you need it). That makes USD particularly asset-friendly: you can preserve materials, assignments, and render-related properties across different tools instead of rebuilding them every time you transfer data.
Finally, USD isn't just a file format — it's a pipeline mindset. It's increasingly supported across professional VFX and 3D software, and the industry trend is clearly moving toward USD as a standard for scene assembly, collaboration, and rendering. If you're working in Houdini, Solaris is one of the most complete authoring environments for taking advantage of these USD workflows in a structured way.
TL;DR
- Collaboration at scale: Teams can work on the same shots/sequences without needing a massive custom pipeline.
- Non-destructive workflow: Layered "opinions" let you override, iterate, and roll back changes cleanly.
- Consistent updates: Asset and scene changes can propagate across a shot or entire sequence.
- Handles heavy scenes: Built to manage complex, data-rich environments efficiently.
- Asset-friendly: Preserves materials/assignments/render properties across software; supports variants and payloads.
- Efficient loading + smaller files: Modular structure and payload-based loading reduce memory usage and keep files manageable.
- Render integration: Designed to connect cleanly with render engines in modern pipelines.
- Industry momentum: Broad DCC support and a strong trajectory toward being the standard for 3D collaboration and scene assembly.
- Solaris (optional note): A strong USD authoring environment that exposes these benefits clearly in practice.
What Is a Layer in USD?
A USD layer is essentially a .usd file on disk. Here are some common USD file extensions and what they mean:
.usda— the human-readable USD file type.- File sizes are larger but can be helpful as "pointer files" or for debugging.
.usdc— the binary-encoded USD file type.- File sizes are much more efficient and smaller overall, but not human-readable.
.usd— can contain either of the above, but is typically.usdc..usdz— packages all dependent layer files and textures together.- Not great for use in a production VFX pipeline.
- Typically used for phone AR applications.
Why Are USD Files Called Layers?
It's because of our ability to combine (layer) multiple USD files together to create a single scene. You can build the exact same 3D scene in USD with vastly different underlying layer structures:
- The layered approach: multiple underlying layers point to the
.usdfiles, updating automatically, small file size (serves as a pointer only). - The flatten approach: a singular layer, all information baked in, not updating, large file size.
USD Composition Arcs
How USD layers combine together to build a 3D scene.
Sublayer
The most basic way to add a USD file to a scene. It tells USD to add the primitives in the selected file without renaming or repositioning them.
References
A reference is generally used to assemble individual assets into sets and scenes.
The main difference between a sublayer and a reference:
- A sublayer brings in the whole scene, and the path is not modifiable.
- A reference brings in a specific primitive (and its child primitives) into the scene, and the path is modifiable.
Other composition arcs I'm still filling in notes on as I learn them: Payload, Variants, Inherits, Specializes.
Opinions
An opinion is expressed when we set a value on a USD attribute or property. Having an opinion is always stronger than having no opinion.
Writing USD Layers
Save Style
- Flatten implicit layers — when working with others and you need to sublayer in other USD files.
- Flatten all layers — when working on your own, everything lives in the same file.
Configure Layer
Saves the node tree above into a USD file.
Output Processors
- Copy All Assets to Referencing Layer Directory — saves all textures to disk. Make sure to specify a name for the folder, and make sure this processor is on top when used.
- Save Paths Relative to Output Path — e.g.
./data/camera.usdinstead of$HIP/usd/RBL3_0101_lgt_v002/export_v006/data/camera.usd.
Saving Animation
For a multi-shot sequence, follow this workflow:
- Create a Configure Layer node and specify the frame range.
- In the USD ROP, set Frame Range to "Render Frame Range From Stage."
- Configure a layer for each shot and use a switch node to toggle between shots — this way you don't need to readjust the frame range in the USD ROP for every shot rendered.