FlashGenius Logo FlashGenius
NCP-OUSD Register for the NVIDIA NCP-OUSD Exam โ€” $200 ยท 60โ€“70 questions ยท 2-year credential
Register for Exam Start Free Trial โ†’
NVIDIA NCP-OUSD ยท Exam Weight: 23%

NCP-OUSD: Composition
Layers, Arcs & LIVERPS

Master the largest single exam topic โ€” all 6 composition arcs, LIVERPS resolution order, layer stack, opinion strength, and scene composition debugging.

60โ€“70 Questions 120 Minutes $200 Exam Fee 2-Year Credential

Why composition is USD's superpower: Universal Scene Description allows studios to compose entire production scenes from multiple layers and files โ€” asset layers, shot overrides, department contributions โ€” all without a single destructive edit. Every modern studio pipeline (from feature film to game development) depends on composition arcs to keep assets shareable, overridable, and non-destructive. Mastering this topic is the key to passing NCP-OUSD and to working effectively with USD in production.

Core Concepts at a Glance

Four foundational ideas underpin all of USD composition.

๐Ÿ“š

Layer Stack

Ordered list of layers; opinions resolved from strongest (top) to weakest (bottom). SubLayers build the stack. Every layer contributes opinions to the same composed result.

๐Ÿ”—

Composition Arcs

The 6 mechanisms to bring scene data together: subLayers, references, payloads, inherits, specializes, variants. Each has different semantics and strength.

โšก

LIVERPS

The resolution order acronym: Local โ†’ Inherits โ†’ Variants โ†’ References โ†’ Payloads โ†’ SubLayers. Strongest first, weakest last.

๐Ÿ†

Opinion Strength

Stronger (higher in LIVERPS) wins. Only one value survives per attribute per time code. Local opinions always win; subLayer opinions always lose.

Exam strategy: This topic carries 23% of the exam weight โ€” expect 14โ€“16 questions specifically on composition arcs, LIVERPS order, and debugging. Know not just what each arc does, but when to choose it and where it falls in LIVERPS.

Deep-Dive: Composition Concepts

Detailed explanations, Python examples, and reference tables for all 6 arcs.

The Layer Stack & SubLayers

A layer is a single file (a .usda, .usdc, or .usdz) or an in-memory object containing opinions about prims and their attributes. Layers are the atomic unit of USD composition.

The layer stack is formed by a layer's subLayerPaths list. The first entry is strongest; entries later in the list are progressively weaker โ€” like a stack of transparency sheets where the top sheet's ink shows through to the bottom.

  • Editing target: where new opinions are written. Set with stage.SetEditTarget(layer).
  • Muting: stage.MuteLayer(identifier) excludes a layer from composition without removing it from disk.
  • All paths in subLayerPaths are relative to the layer that contains them.
# Build a layer stack: stronger.usda overrides weaker.usda
stage = Usd.Stage.CreateNew("root.usda")
root_layer = stage.GetRootLayer()
root_layer.subLayerPaths = ["stronger.usda", "weaker.usda"]

# Set edit target to the stronger layer
stronger = Sdf.Layer.FindOrOpen("stronger.usda")
stage.SetEditTarget(stronger)

# Mute a layer (excludes from composition, non-destructive)
stage.MuteLayer("weaker.usda")

SubLayers Arc

SubLayers aggregates layers additively at the stage level. Every prim and attribute opinion from every sublayer contributes to the same composed result.

  • Strongest opinion wins per-attribute โ€” not per-prim
  • Used for: shot overrides on top of asset layers, department contributions (anim, FX, lighting)
  • A layer's own opinions are stronger than anything in its subLayers
  • All paths are relative to the containing layer
Remember: SubLayers is the weakest arc in LIVERPS (the "S"). Everything else wins over a sublayer opinion.

References Arc

References bring external asset data under a target prim path in the referencing layer. This is the primary mechanism for asset assembly โ€” bringing a character, prop, or environment into a shot.

  • Loads data eagerly (immediately on stage open)
  • Can reference external files or internal prims (same stage, different path)
  • Set instanceable for efficiency: prim.SetInstanceable(True)
  • Supports time offset and scale via reference metadata
from pxr import Usd, Sdf

stage = Usd.Stage.CreateNew("shot.usda")
xform = stage.DefinePrim("/World/Hero", "Xform")

# Add external reference
refs = xform.GetReferences()
refs.AddReference("assets/hero.usda", primPath="/Hero")

# Add internal reference
refs.AddReference("", primPath="/SourcePrim")

# Enable instancing for repeated assets
xform.SetInstanceable(True)

Payloads Arc

Payloads are like references but load-on-demand. Unloaded payloads appear as lightweight proxy prims โ€” you can traverse the scene graph and see the prim exists without paying the cost of loading all its data.

  • Use for: large geometry, crowd assets, anything expensive not always in camera
  • Open stage with nothing loaded: load=Usd.Stage.LoadNone
  • Load/unload individually or in batches
  • Payloads are weaker than References in LIVERPS (P comes after R)
from pxr import Usd

# Open stage with all payloads unloaded
stage = Usd.Stage.Open("scene.usda", load=Usd.Stage.LoadNone)

# Add a payload to a prim
prim = stage.GetPrimAtPath("/World/BigAsset")
prim.GetPayloads().AddPayload("heavyAsset.usda")

# Load and unload individually
stage.Load("/World/BigAsset")
stage.Unload("/World/BigAsset")

# Batch load/unload
stage.LoadAndUnload(
    toLoad=["/World/AssetA", "/World/AssetB"],
    toUnload=["/World/OldAsset"]
)

Inherits Arc

Inherits propagates opinions from a class prim (abstract โ€” never rendered directly) to all prims that inherit from it. Changes to the class propagate instantly to all inheritors.

  • Inheriting prim's local opinions win over inherited ones
  • Stronger than References in LIVERPS (I comes before R)
  • Useful for: shared material overrides, rig defaults, look-dev propagation across many assets
  • Multiple inheritance supported
  • Class prims use the class specifier (not def)
from pxr import Usd, Sdf

stage = Usd.Stage.CreateNew("chars.usda")

# Define an abstract class prim
base = stage.CreateClassPrim("/BaseCharacter")
base.CreateAttribute("material:binding", Sdf.ValueTypeNames.String).Set("default_mtl")

# Inherit from the class
hero = stage.DefinePrim("/World/Hero", "Xform")
hero.GetInherits().AddInherit(Sdf.Path("/BaseCharacter"))

# Hero's local opinion overrides the inherited one
hero.CreateAttribute("material:binding", Sdf.ValueTypeNames.String).Set("hero_mtl")

Specializes Arc

Specializes is similar to inherits but weaker. A specialized prim's opinions fall below referenced and inherited opinions in LIVERPS. This allows a "base" look to persist while references and overrides take precedence.

  • Comes after References in LIVERPS (but the acronym shows I and not S before it โ€” Specializes is the most nuanced arc)
  • Use case: a character variant that keeps a fallback look but allows pipeline overrides to win
  • Key distinction: Inherits beats Specializes โ€” inherited opinions always win over specialized ones
  • Rare in day-to-day use but tested on the exam
from pxr import Usd, Sdf

stage = Usd.Stage.CreateNew("variants.usda")

# Define base class
base = stage.CreateClassPrim("/CharBase")

# Specialize from the base
char = stage.DefinePrim("/World/Character", "Xform")
char.GetSpecializes().AddSpecialize(Sdf.Path("/CharBase"))
# References and Inherits will override the specialized opinions

Variants & VariantSets

A VariantSet is a named group of mutually exclusive alternatives โ€” like "shadingVariant" containing "metal", "wood", "plastic". Only one variant is active at a time; the selection is stored as metadata, not as a new file.

  • Author variant-specific opinions using the variant edit context
  • Nested variant sets are supported
  • Variant selection stored in the layer that holds the reference/asset
  • Non-destructive A/B switching with zero file duplication
from pxr import Usd, Sdf

stage = Usd.Stage.CreateNew("asset.usda")
prim = stage.DefinePrim("/Asset", "Mesh")

# Create a variant set and variants
vsets = prim.GetVariantSets()
vset = vsets.AddVariantSet("shadingVariant")

# Add variants
vset.AddVariant("metal")
vset.AddVariant("wood")
vset.AddVariant("plastic")

# Set active selection
vset.SetVariantSelection("metal")

# Author opinions inside a variant
vset.SetVariantSelection("metal")
with vset.GetVariantEditContext():
    prim.CreateAttribute("roughness", Sdf.ValueTypeNames.Float).Set(0.2)

vset.SetVariantSelection("wood")
with vset.GetVariantEditContext():
    prim.CreateAttribute("roughness", Sdf.ValueTypeNames.Float).Set(0.8)

LIVERPS Resolution Order

When multiple arcs contribute opinions to the same attribute, USD uses LIVERPS to determine which opinion wins. Stronger arcs (listed first) always override weaker arcs (listed last).

LetterArcStrengthNotes
LLocalStrongest (1)Opinions authored directly on the prim in the current layer
IInherits2ndFrom class prims via inherits arc โ€” beats references
VVariants3rdActive variant's opinions โ€” weaker than inherits
RReferences4thFrom referenced external files โ€” most common arc
PPayloads5thFrom payload files โ€” weaker than references
SSubLayersWeakest (6)From the layer stack โ€” lowest priority of all arcs
Key rules: Local always wins. SubLayers always lose. Within each arc level, stronger layers in the layer stack win over weaker layers. A prim's own layer is stronger than the arc's target layer.

Authoring & Debugging Composition

When a composed value surprises you, use these tools to inspect what's happening:

  • prim.GetPrimStack() โ€” list all contributing Sdf.PrimSpec objects in strength order
  • attr.GetPropertyStack() โ€” all contributing opinions for a specific attribute
  • attr.GetResolveInfo() โ€” find exactly which layer "won" for an attribute value
  • UsdUtils.FlattenLayerStack(stage) โ€” flatten to see the final composed result
  • usdview --inspect โ€” visual composition graph explorer
from pxr import Usd, UsdUtils

stage = Usd.Stage.Open("scene.usda")
prim = stage.GetPrimAtPath("/World/Hero")

# See all specs contributing to this prim (strongest first)
for spec in prim.GetPrimStack():
    print(spec.layer.identifier, spec.path)

# Check which layer won for a specific attribute
attr = prim.GetAttribute("roughness")
resolve_info = attr.GetResolveInfo()
print("Winning layer:", resolve_info.GetSource())

# See all opinions for the attribute
for spec in attr.GetPropertyStack():
    print(spec.layer.identifier, "->", spec.default)

# Flatten the composed result
flat_layer = UsdUtils.FlattenLayerStack(stage)
flat_layer.Export("flat_result.usda")

Memory Hooks

Six memorable mental models to lock in the key concepts for exam day.

1

"LIVERPS" โ€” Say It Like "Liverps"

Local โ†’ Inherits โ†’ Variants โ†’ References โ†’ Payloads โ†’ SubLayers. Strongest first. Local always wins. SubLayers always lose. Memorize this order cold โ€” it will appear directly on the exam.

2

"References = eager, Payloads = lazy"

References load immediately when the stage opens. Payloads load on demand โ€” call stage.Load() explicitly. Use payloads for heavy assets not always needed. Both bring external data, but their load behavior is the key difference.

3

"Inherits beats Specializes โ€” always"

Inherits is 2nd in LIVERPS. Specializes comes after References โ€” it is the weakest non-subLayer arc. Use Inherits for shared defaults that should propagate down. Use Specializes for a "keep base look but let references override" pattern.

4

"SubLayers = additive, References = targeted"

SubLayers merges entire layers at the stage level โ€” every prim in every sublayer contributes. References brings one asset's prim tree under a specific target path. SubLayers is about stacking; References is about assembly.

5

"Variant = non-destructive A/B"

Variants store alternative opinions without file duplication. The active variant selection is just metadata โ€” switch from "metal" to "wood" without touching the asset file at all. The variant edit context is how you write variant-specific opinions.

6

"GetPrimStack = your composition debugger"

When a value surprises you, call prim.GetPrimStack() to see every contributing spec in strength order. Use attr.GetPropertyStack() for a specific attribute, and attr.GetResolveInfo() to find the exact winning layer.

Knowledge Quiz

10 questions ยท one at a time ยท instant feedback

Question 1 of 10Score: 0

1. What is the correct LIVERPS resolution order from strongest to weakest?

A SubLayers โ†’ Payloads โ†’ References โ†’ Variants โ†’ Inherits โ†’ Local
B Local โ†’ Inherits โ†’ Variants โ†’ References โ†’ Payloads โ†’ SubLayers
C References โ†’ SubLayers โ†’ Local โ†’ Variants โ†’ Inherits โ†’ Payloads
D Local โ†’ Variants โ†’ Inherits โ†’ SubLayers โ†’ References โ†’ Payloads
Local is always strongest; SubLayers always weakest. LIVERPS = Local, Inherits, Variants, References, Payloads, SubLayers.

2. Which composition arc loads data on demand and can be controlled with stage.Load()?

A References
B SubLayers
C Payloads
D Inherits
Payloads are load-on-demand (lazy). References load immediately (eager). Use stage.Load() / stage.Unload() to control payload loading.

3. Which prim specifier is used to define the target of an inherits arc?

A def
B over
C class
D abstract
Class prims use the "class" specifier. They are abstract โ€” never directly rendered โ€” but their opinions propagate to all prims that inherit from them.

4. A VariantSet named "lodVariant" has variants "hi", "mid", "lo". Which Python call sets the active variant to "hi"?

A vset.SetVariant("hi")
B vset.SetVariantSelection("hi")
C vset.ActivateVariant("hi")
D vset.SelectVariant("hi")
The correct method is SetVariantSelection(). The selection is stored as metadata in the layer โ€” it switches which variant's opinions are active.

5. Which arc is WEAKEST in the LIVERPS resolution order?

A References
B Inherits
C Local
D SubLayers
SubLayers is always the weakest arc โ€” the "S" in LIVERPS. Every other arc type (Local, Inherits, Variants, References, Payloads) wins over a sublayer opinion.

6. What does stage.MuteLayer(identifier) do?

A Deletes the layer from disk
B Excludes the layer from composition without removing it
C Makes the layer read-only
D Sets the layer as the edit target
MuteLayer is non-destructive โ€” the layer file remains on disk and in the subLayerPaths, but USD excludes it from composition entirely. It can be unmuted later.

7. An asset needs swappable shading looks (metal, wood, plastic) without duplicating geometry files. Which arc is best suited?

A SubLayers
B References
C Variants
D Inherits
Variants are exactly designed for mutually exclusive alternatives stored without file duplication. The geometry stays in one file; only the shading opinions differ per variant.

8. What is the key difference between References and Inherits?

A References are weaker than Inherits in LIVERPS; Inherits load on demand
B Inherits propagate from class prims and are stronger than References in LIVERPS
C References use class prims; Inherits use def prims
D There is no difference โ€” they are interchangeable
Inherits (I) comes before References (R) in LIVERPS โ€” inherited opinions beat referenced opinions. Inherits use class prims; References bring external files under a target prim path.

9. Which Python method reveals which layer's opinion wins for a specific attribute?

A attr.GetLayer()
B attr.GetWinningLayer()
C attr.GetResolveInfo()
D attr.GetComposedValue()
GetResolveInfo() returns a UsdResolveInfo object that identifies the source (winning layer) of an attribute's value at a given time code. Essential for debugging.

10. When opening a stage with Usd.Stage.LoadNone, what happens to payload prims?

A They are loaded immediately
B They are deleted
C They remain as unloaded proxies
D They raise an error
LoadNone opens the stage without loading any payloads. Payload prims are still visible in the scene graph as lightweight proxies โ€” you can traverse to them, but their full data is not loaded.
0/10
Quiz Complete

Flashcards

Click any card to flip. 8 cards covering the essential concepts.

What does LIVERPS stand for? Tap to reveal
Answer
Local โ†’ Inherits โ†’ Variants โ†’ References โ†’ Payloads โ†’ SubLayers

This is the composition arc resolution order from strongest (Local) to weakest (SubLayers). Local always wins; SubLayers always lose.
SubLayers vs References โ€” key difference? Tap to reveal
Answer
SubLayers: merge entire layers additively at the stage level โ€” first listed is strongest.

References: bring an asset's prim tree under a specific target path โ€” load immediately and eagerly.
Payloads vs References โ€” when to use each? Tap to reveal
Answer
Both bring external data, but Payloads are load-on-demand (lazy). Use stage.Load('/prim') to load. Unloaded payloads appear as lightweight proxies. Prefer payloads for heavy assets not always in camera.
What is the inherits arc used for? Tap to reveal
Answer
Propagates opinions from a class prim to multiple prims. The inheriting prim's local opinions win over inherited ones. Stronger than References in LIVERPS. Used for shared rig defaults, material propagation across many assets.
What is the specializes arc? Tap to reveal
Answer
Like inherits but WEAKER โ€” comes after References in LIVERPS. Lets a prim keep a "base" look defined in a class while allowing reference overrides to take precedence. Rare but tested on the exam.
How do you author variant-specific opinions? Tap to reveal
Answer
Use the variant edit context:
with vset.GetVariantEditContext():
prim.CreateAttribute(...)

All opinions authored inside the context belong to the currently selected variant.
prim.GetPrimStack() โ€” what does it return? Tap to reveal
Answer
Returns all Sdf.PrimSpec objects contributing opinions to this prim, in strength order (strongest first). Essential for debugging unexpected composition results. Pair with attr.GetPropertyStack() for attribute-level detail.
What is the edit target? Tap to reveal
Answer
The layer where new opinions are written. Set via stage.SetEditTarget(layer). Only one layer is the edit target at a time. New prims and attribute sets go to this layer โ€” not necessarily the root layer.

Study Advisor

Targeted guidance for mastering the largest exam topic.

๐ŸŽฏ

Exam Strategy

Composition is 23% of the exam โ€” the single largest topic. Expect 14โ€“16 questions. LIVERPS order is almost certainly tested directly. Know when to use each arc and how they differ from each other. Focus especially on: Payload vs Reference (lazy vs eager), Inherits vs Specializes (strength order), and the Python API for each arc.

๐Ÿ“š

Core Resources

NVIDIA Learn OpenUSD Module 3 "Composition Basics" and Module 5 "Creating Composition Arcs" are the primary study materials. Supplement with the USD Glossary for precise definitions of each arc.

๐Ÿ’ป

Hands-On Practice

Create a multi-layer scene from scratch: write a root.usda that subLayers an asset.usda and a shot_override.usda. Add references to external assets, switch variant selections in Python, and use usdview --inspect to visualize the composition graph. Nothing cements LIVERPS like seeing it work live.

โš ๏ธ

Common Mistakes

โ€” Confusing SubLayers (stage-level, additive) with References (prim-level, targeted)
โ€” Forgetting Inherits beats References in LIVERPS (I comes before R)
โ€” Thinking Payloads are stronger than References โ€” they are not (P comes after R)
โ€” Not knowing that Specializes is weaker than References (Specializes comes after References)
โ€” Forgetting that class prims (not def) are required for inherits targets

๐Ÿ”—

Related Exam Topics

Composition feeds directly into Debugging & Troubleshooting (11%) โ€” most debugging scenarios involve unexpected composition results from arc conflicts. Content Aggregation (10%) heavily uses references and instancing, which builds on the composition fundamentals covered here. Master composition first, and these topics become much easier.

Resources

Official links for study, registration, and reference.

Official Certification Page

NVIDIA NCP-OUSD exam overview, objectives, and registration info

Visit โ†’

Learn OpenUSD Module 3 โ€” Composition Basics

NVIDIA's official tutorial covering layer stacks and the fundamentals of USD composition

Study โ†’

Learn OpenUSD Module 5 โ€” Creating Composition Arcs

NVIDIA's official tutorial with hands-on Python examples for all 6 composition arcs

Study โ†’

OpenUSD Glossary

Authoritative definitions for every USD term including each composition arc, LIVERPS, and opinion strength

Reference โ†’

Register for NCP-OUSD Exam

Official Certiverse registration โ€” $200 fee ยท 60โ€“70 questions ยท 120 minutes ยท 2-year credential

Register โ†’

Accelerate Your Exam Prep

FlashGenius gives you adaptive flashcards, timed quizzes, and progress tracking across all NCP-OUSD topics. Start free โ€” no credit card required.

Start Free Trial โ†’