These two domains cover building large, efficient 3D scenes from modular assets and rendering them with geometry, materials, and lights โ a combined 18% of the NCP-OUSD exam.
Self-contained components with clear interfaces; built to be referenced, instanced, and overridden independently.
Reuse one prim's definition across many scene locations with zero data duplication. Native instancing = prototype; point instancing = PointInstancer.
USD's geometry domain: Mesh, Xform, Camera, Scope, Points, BasisCurves, Capsule, Cube, Sphere.
Material binding model (Material → Shader nodes); lighting prims (SphereLight, DomeLight, RectLight, DistantLight, CylinderLight).
| Domain | Weight | Key Topics |
|---|---|---|
| Content Aggregation | ~10% | Modular asset design, model hierarchies, asset interfaces, parallel layer organization, collaborative scene building, instancing |
| Visualization | ~8% | UsdGeom (meshes, cameras, Xform), UsdShade (materials, shaders, NodeGraph), UsdLux (lights), rendering properties |
prim.SetKind("component")customData = {string[] ui:editorHints = ["..."]}from pxr import Usd, Kind
stage = Usd.Stage.Open("asset.usda")
prim = stage.GetPrimAtPath("/World/Tree")
# Set model kind
modelAPI = Usd.ModelAPI(prim)
modelAPI.SetKind(Kind.Tokens.component)
# Check kind
kind = modelAPI.GetKind()
print(f"Kind: {kind}") # component
prim.SetInstanceable(True)prim.IsInstance() → True; prim.GetPrototype() → the shared prototypefrom pxr import Usd, UsdGeom
stage = Usd.Stage.Open("scene.usda")
# Create multiple instances of the same asset
for i in range(10):
prim = stage.DefinePrim(f"/World/Tree_{i}", "Xform")
# Add reference to the asset
prim.GetReferences().AddReference("./tree_asset.usda")
# Mark as instanceable โ shares a prototype with identical composition arcs
prim.SetInstanceable(True)
# Check instance status
tree = stage.GetPrimAtPath("/World/Tree_0")
print(tree.IsInstance()) # True
print(tree.GetPrototype()) # Returns shared prototype prim
positions (point3fArray), orientations (quatfArray), scales (float3Array), protoIndices (intArray), prototypes (relationship to prototype prims)instancer.GetPositionsAttr().Set(positions, time) for animated instancesfrom pxr import Usd, UsdGeom, Gf, Vt
import numpy as np
stage = Usd.Stage.CreateNew("forest.usda")
# Define prototype
treePrim = stage.DefinePrim("/Prototypes/Tree", "Xform")
treePrim.GetReferences().AddReference("./tree.usda")
# Create PointInstancer
instancer = UsdGeom.PointInstancer.Define(stage, "/World/Forest")
# Set prototype relationship
instancer.CreatePrototypesRel().SetTargets(["/Prototypes/Tree"])
# Generate 10,000 random positions
n = 10000
positions = Vt.Vec3fArray(n, [Gf.Vec3f(np.random.uniform(-100, 100),
0,
np.random.uniform(-100, 100))
for _ in range(n)])
instancer.GetPositionsAttr().Set(positions)
# All instances use prototype index 0
protoIndices = Vt.IntArray(n, [0] * n)
instancer.GetProtoIndicesAttr().Set(protoIndices)
stage.Save()
over specs layered on top of a referenced asset to override specific attributes# Override via variant set on the referencing prim (NOT inside the instance)
stage = Usd.Stage.Open("scene.usda")
treePrim = stage.GetPrimAtPath("/World/Tree_0")
# Add variant set for seasonal appearance
varSets = treePrim.GetVariantSets()
varSet = varSets.AddVariantSet("season")
varSet.AddVariant("summer")
varSet.AddVariant("autumn")
varSet.SetVariantSelection("autumn")
with varSet.GetVariantEditContext():
# Override the material reference for autumn look
matPrim = stage.OverridePrim("/World/Tree_0/Looks/LeafMat")
matPrim.GetReferences().AddReference("./autumn_leaves.usda")
faceVertexCounts (int[]), faceVertexIndices (int[]), points (point3f[]), normals (normal3f[]), primvars:st (texCoord2f[], faceVarying)xformOp:translate, xformOp:rotateXYZ, xformOp:scale; xformOpOrder controls evaluation orderfrom pxr import Usd, UsdGeom, Gf, Vt, Sdf
stage = Usd.Stage.CreateNew("mesh_example.usda")
# Create a simple quad mesh
mesh = UsdGeom.Mesh.Define(stage, "/World/Quad")
# Required attributes
mesh.GetPointsAttr().Set(Vt.Vec3fArray([
Gf.Vec3f(-1, 0, -1), Gf.Vec3f(1, 0, -1),
Gf.Vec3f(1, 0, 1), Gf.Vec3f(-1, 0, 1)
]))
mesh.GetFaceVertexCountsAttr().Set(Vt.IntArray([4]))
mesh.GetFaceVertexIndicesAttr().Set(Vt.IntArray([0, 1, 2, 3]))
# UV texture coordinates (primvars:st, faceVarying interpolation)
st = UsdGeom.PrimvarsAPI(mesh).CreatePrimvar(
"st", Sdf.ValueTypeNames.TexCoord2fArray,
UsdGeom.Tokens.faceVarying
)
st.Set(Vt.Vec2fArray([
Gf.Vec2f(0,0), Gf.Vec2f(1,0),
Gf.Vec2f(1,1), Gf.Vec2f(0,1)
]))
# Xform transform
xform = UsdGeom.Xform.Define(stage, "/World/Root")
UsdGeom.XformCommonAPI(xform).SetTranslate(Gf.Vec3d(0, 5, 0))
stage.Save()
material:binding relationshipUsdShade.MaterialBindingAPI(prim).Bind(material) โ apply material to priminfo:id identifies the shader type (e.g., "UsdPreviewSurface")diffuseColor (color3f), metallic (float), roughness (float), opacity (float), normal (normal3f)UsdShade.ConnectableAPI for managing shader connectionsfrom pxr import Usd, UsdShade, Sdf, Gf
stage = Usd.Stage.Open("scene.usda")
# Create Material
matPath = Sdf.Path("/World/Looks/MetalMat")
material = UsdShade.Material.Define(stage, matPath)
# Create UsdPreviewSurface shader
shaderPath = matPath.AppendChild("PBRShader")
shader = UsdShade.Shader.Define(stage, shaderPath)
shader.CreateIdAttr("UsdPreviewSurface")
# Set PBR inputs
shader.CreateInput("diffuseColor", Sdf.ValueTypeNames.Color3f).Set(Gf.Vec3f(0.2, 0.4, 0.8))
shader.CreateInput("metallic", Sdf.ValueTypeNames.Float).Set(0.9)
shader.CreateInput("roughness", Sdf.ValueTypeNames.Float).Set(0.1)
shader.CreateInput("opacity", Sdf.ValueTypeNames.Float).Set(1.0)
# Connect shader surface output to material
shaderOutput = shader.CreateOutput("surface", Sdf.ValueTypeNames.Token)
material.CreateSurfaceOutput().ConnectToSource(shaderOutput)
# Bind material to geometry prim
meshPrim = stage.GetPrimAtPath("/World/Quad")
UsdShade.MaterialBindingAPI(meshPrim).Bind(material)
stage.Save()
intensity (float), color (color3f), exposure (float), enableColorTemperature (bool), colorTemperature (float)radius (float); soft area lighttexture:file (asset); HDR environment mapwidth, height; area lightangle (float); sun-like directional lightlightLink and shadowLink collections to control what geometry a light affectsfrom pxr import Usd, UsdLux, Sdf, Gf
stage = Usd.Stage.Open("scene.usda")
# DomeLight โ HDR environment map (image-based lighting)
dome = UsdLux.DomeLight.Define(stage, "/World/Lights/EnvLight")
dome.CreateIntensityAttr(1.0)
dome.CreateTextureFileAttr().Set(Sdf.AssetPath("./hdri/studio.exr"))
# SphereLight โ soft omnidirectional area light
sphere_light = UsdLux.SphereLight.Define(stage, "/World/Lights/KeyLight")
sphere_light.CreateIntensityAttr(5000.0)
sphere_light.CreateColorAttr().Set(Gf.Vec3f(1.0, 0.95, 0.9))
sphere_light.CreateRadiusAttr(0.3)
# DistantLight โ directional sun light
sun = UsdLux.DistantLight.Define(stage, "/World/Lights/Sun")
sun.CreateIntensityAttr(10.0)
sun.CreateAngleAttr(0.53) # angular diameter in degrees
sun.CreateColorTemperatureAttr(6500.0)
sun.CreateEnableColorTemperatureAttr(True)
# RectLight โ rectangular area light
rect = UsdLux.RectLight.Define(stage, "/World/Lights/FillLight")
rect.CreateWidthAttr(2.0)
rect.CreateHeightAttr(1.0)
rect.CreateIntensityAttr(2000.0)
stage.Save()
Conceptual anchors to lock in key distinctions for exam day.
Model kind hierarchy. A component is a leaf asset. An assembly groups components. A group organizes without a fixed structure. Set with prim.SetKind().
prim.SetInstanceable(True) makes it share a prototype with all identical peers. Can't author inside an instance โ edit the prototype.
For large repeated instances (crowds, vegetation), PointInstancer is far more efficient than individual prim copies. Uses positions + protoIndices arrays.
UsdShade.MaterialBindingAPI(prim).Bind(material). The geometry prim needs the API applied; the material lives elsewhere in the hierarchy.
diffuseColor + metallic + roughness + opacity = the 4 most tested attributes. info:id = "UsdPreviewSurface".
DomeLight with texture:file pointing to an EXR/HDR provides image-based lighting. SphereLight = soft point source. DistantLight = sun.
info:id attribute on a UsdShade.Shader specify?Click any card to flip it.
Model kinds in USD
tap to flipcomponent (leaf asset, self-contained), assembly (group of components), group (organizational), subcomponent (part within a component). Set via prim.SetKind('component').
Native instancing vs PointInstancer
tap to flipNative: prim.SetInstanceable(True) โ identical prims share one prototype. PointInstancer: scatter instances at arbitrary positions with positions/protoIndices arrays โ best for thousands of instances.
UsdGeom.Mesh required attributes
tap to flipfaceVertexCounts (int[] โ verts per face), faceVertexIndices (int[] โ vertex indices), points (point3f[] โ vertex positions). Optional but common: normals, primvars:st.
Material binding in UsdShade
tap to flipApply UsdShade.MaterialBindingAPI to a geometry prim. Call .Bind(material). The material:binding relationship connects the prim to the Material prim in the shading hierarchy.
UsdPreviewSurface key inputs
tap to flipdiffuseColor (color3f), metallic (float 0โ1), roughness (float 0โ1), opacity (float 0โ1), normal (normal3f), emissiveColor (color3f). info:id = 'UsdPreviewSurface'.
UsdLux light types
tap to flipSphereLight (soft point, has radius), DomeLight (HDRI environment via texture:file), RectLight (area, width×height), DistantLight (sun-like directional, has angle), CylinderLight, DiskLight.
xformOps on UsdGeom.Xform
tap to flipOperators: xformOp:translate, xformOp:rotateXYZ (or rotateX/Y/Z), xformOp:scale, xformOp:transform (full matrix). xformOpOrder attribute controls evaluation order.
Parallel layer organization
tap to flipDifferent departments author to separate layers (anim.usda, look.usda, fx.usda) which are composed via subLayers or references. Nobody overwrites each other โ all layers contribute opinions non-destructively.
Visualization questions often test specific attribute names (faceVertexCounts, primvars:st, info:id). Content Aggregation questions test model kinds and instancing concepts. Know the difference between native instancing and PointInstancer.
NVIDIA Learn OpenUSD Module 6 "Asset Structure Principles"; Module 8 "Asset Modularity and Instancing"; USD Schema docs at openusd.org; UsdPreviewSurface spec.
Create a simple UsdPreviewSurface material and bind it to a Mesh; scatter 100 instances with PointInstancer; experiment with model kinds using prim.SetKind().
Forgetting that you cannot author inside an instance prim; confusing Scope (no transform) with Xform (has transform); mixing up primvars:st interpolation (usually faceVarying for UV maps).
Instancing knowledge connects to Content Aggregation (10%) and Data Modeling (13%); UsdShade feeds into Pipeline Development (14%) where exporters must correctly export material networks.
Official exam overview, objectives, and registration information.
NVIDIA's official module covering asset file layout, model kinds, and parallel layer organization.
Deep dive into native instancing, PointInstancer, and modular asset design patterns.
Complete API reference for UsdGeom, UsdShade, UsdLux, and all USD schemas.
Full specification for the UsdPreviewSurface shader including all input parameters.
Purchase your exam voucher and schedule your NCP-OUSD certification exam.