Omniverse Realtime Viewer
NVIDIAOfficialCreated by NVIDIA Omniverse
- Skill
- Tool integration
- Software development
- Apache-2.0
- Medium risk
AutoGineer summary
Written by AutoGineer from the skill’s own files, not by the author
The Omniverse Realtime Viewer skill acts as a central routing and architectural framework for developing USD-based 3D viewer applications. It provides a structured approach to composing rendering, scene state, and delivery mechanisms, ensuring that developers can integrate OVRTX rendering, OVStage scene management, and various UI or streaming adapters effectively. The skill emphasizes a modular architecture where the viewer runtime, UI/input adapters, and delivery systems are decoupled, allowing for consistent behavior across local and streamed environments.
What it does
- Provides a routing architecture for USD viewer apps, XR delivery, and GPU-accelerated rendering.
- Defines the separation of concerns between viewer runtime, UI adapters, and delivery systems.
- Offers guidance on integrating OVRTX for high-fidelity 3D rendering.
- Establishes conventions for camera interaction, scene state management, and input handling.
- Supports the implementation of specialized features like stylized rendering and CAE/CFD visualization.
- Provides protocols for agent-to-UI communication and scene control.
When to use it
- When starting the development of a new USD-based realtime viewer application.
- When integrating advanced rendering features like stylized visualization or AOV switching.
- When building XR or spatial editing capabilities into an existing Omniverse application.
- When you need to standardize the architecture for local and streamed viewer deployments.
- When implementing chat-driven scene control or agent-based inspection of a 3D scene.
Advantages
- Promotes a clean, modular architecture that separates rendering logic from UI and transport.
- Ensures consistent behavior across different delivery methods, such as local windows or WebRTC streaming.
- Provides clear paths for extending functionality without disrupting the core viewer runtime.
- Facilitates the integration of complex simulation and visualization data into the viewer.
- Standardizes conventions for scene state, selection, and camera control.
Usage examples
- “How do I set up a basic USD viewer application using the Omniverse Realtime Viewer architecture?”
- The agent will guide you to start with the viewer app reference, resolve dependencies, and implement the core runtime owner to manage the OVStage and OVRTX renderer.
- “I need to add stylized rendering to my existing viewer. Where should I start?”
- The agent will direct you to the stylized visualization references to implement the required USD/Lua/CUDA nodes within your existing runtime owner.
- “How can I enable an AI agent to control the viewer scene?”
- The agent will point to the A2UI Scene Copilot reference to implement an operation interface that allows the agent to send commands through the existing runtime owner.
- “How do I switch between different render outputs like beauty and depth in my viewer?”
- The agent will explain how to use the AOV switching reference to map RenderVars and update the RenderProduct's orderedVars through the runtime owner.
Install
Download the skill as a ZIP:
https://mp-staging.autogineer.com/agent-skills/nvidia/omniverse-realtime-viewer/downloadUnzip it into the cross-client skills folder of your project:
mkdir -p .agents/skills && unzip omniverse-realtime-viewer.zip -d .agents/skills
Documentation by NVIDIA Omniverse
<!-- SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -->
<!-- SPDX-License-Identifier: Apache-2.0 -->
Omniverse Realtime Viewer
Build responsive USD viewers by composing OVRTX rendering, OVStage scene state, and the delivery/UI libraries appropriate to the app. Use this package for viewer architecture and interaction; use each selected SDK's upstream guidance for installation and exact release-specific APIs.
Start With The App
When delivery is explicit, select its recipe through
references/routing.mdand follow its current phase. Otherwise start withreferences/usd-viewer-app/README.md. For an existing app, keep its architecture and read only the references for the requested change. Broad app, conventions and UI catalogs are lookups as needed.Resolve the selected libraries through
references/dependencies/README.md. Preserve the project's manifest unless an upgrade is requested.Build a working frame and camera interaction in the chosen shell, then add the requested capabilities. Read
references/conventions.mdfor shared input, camera, selection, and protocol conventions.Use
references/viewer-ux-workflow/README.mdfor broader interface design. Loading, selection feedback, errors, and input responsiveness belong in the first working app, alongside rendering.Validate the actual delivery path with
references/validation.md. A browser screenshot does not validate a native window or a different transport.
Architecture
| Owner | Responsibility |
|---|---|
| Viewer runtime | Own the live OVStage, publication clock, OVRTX renderer, scene changes, and render stepping. |
| UI and input adapter | Display frames and copied app state; send user intent to the runtime owner. |
| Storage/query/simulation workers | Perform their assigned work and return results through the selected integration boundary. |
| Delivery adapter | Present locally or stream through ovstream; respect frame ownership and backpressure. |
Use OVRTX for USD/3D rendering. Browser apps display its WebRTC video; local apps present its output through their native shell. A missing GPU means rendering is unverified, not a reason to substitute a browser 3D renderer.
Keep viewer cameras, settings, effects, and transient edits in app-owned session
or runtime state so the source USD stays intact. Serialize scene mutation and
render stepping through the runtime owner. Read
references/ovstage-ovrtx-integration/README.md for that loop, then the population
or data-plane references when implementing scene loading or attribute writes.
Keep expensive loading and metadata work off the UI and render threads. Keep transport details behind a delivery adapter so camera, selection, properties, and loading state can be reused across local and streamed shells.
Add Capabilities As Needed
Use references/routing.md to select camera/picking, scene management, render
settings, cloud assets, simulation, editor tools, deployment, or CAE/CFD
visualization. Read the selected capability's implementation flow and its linked
contract; the full reference catalog is not a prerequisite for a first frame.
For simulation, use the routing reference's Simulation Ecosystem section plus
references/realtime-sim-integration/README.md. For UI-driven forces or control,
add references/interaction-round-trip/README.md.
For example scenes, use references/usd-sample-data/README.md. When a runtime
failure needs diagnosis, use references/troubleshooting/README.md and the
selected SDK's matching release guidance before changing the architecture.
Solid Modeling: Upstream First
For usd-brep, exact BRep, solid modeling, kernel failures, CAD topology, or
BrepArray questions, first read references/dependencies/README.md → USD BRep. Follow the
owning repository's current agent guidance, skills, operation docs, and package
API before selecting local integration references. Discover the upstream router
rather than assuming skill names or directory layouts remain fixed. Upstream
owns modeling semantics, schema rules, tuning, and diagnostics; this package
owns OVRTX display, worker handoff, selection mapping, and publication timing.
GPU Processing And Stylized Viewers
For custom GPU processing, chained outputs and lens sampling, read
references/spg-processing/README.md. For toon, ink, technical/X-Ray styles,
geometry strokes or full wireframe, continue to
references/stylized-visualization/implementation.md. Its USD/Lua/CUDA starting
node and geometry/depth/composite build sequence work with the selected viewer
recipe; use references/stylized-visualization/style-recipes.md for the preset
math and references/stylized-visualization/README.md for supporting contracts.
Implement the result inside the existing OVRTX/runtime owner and deliver the
published processed output. These instructions do not require a sample checkout
or a prior stylized-rendering implementation.
For an optional usd-brep geometry source, first read
references/dependencies/README.md → USD BRep and the owning repository's
current agent guidance, skills, and operation docs; then read
references/stylized-visualization/usd-brep-source.md for the display boundary.
XR Viewers
For headsets, immersive viewers, or spatial editors, start with
references/xr-viewer-recipe/README.md. Resolve SDK setup and contracts through
references/dependencies/ovxr.md; the library owns OpenXR lifecycle and frame
submission. For controllers, hands, navigation, or scene tools, add
references/xr-spatial-input/README.md and
references/ovxr-python-interactions/README.md. For projection-integrated UI,
read references/ovxr-composition-ui/README.md and
references/ovxr-composition-ui-validation/README.md.
Files
- ATTRIBUTION.mdAdded by AutoGineer943 B
- BENCHMARK.md13.4 KiB
- LICENSELicence file added by AutoGineer11.2 KiB
- SKILL.md6.4 KiB
- evals/evals.json7.0 KiB
- references/a2ui-scene-copilot/README.md10.9 KiB
- references/aov-switching/README.md10.5 KiB
- references/cae-cfd-visualization/README.md10.1 KiB
- references/cae-cfd-visualization/cae-data-ingestion.md5.6 KiB
- references/cae-cfd-visualization/coordinate-systems-and-up-axis.md11.0 KiB
- references/cae-cfd-visualization/data-and-operators.md11.7 KiB
- references/cae-cfd-visualization/driving-cae-viz-via-ovstage.md6.4 KiB
- references/cae-cfd-visualization/emitter-and-seed-sources.md16.3 KiB
- references/cae-cfd-visualization/glyphs.md7.1 KiB
- references/cae-cfd-visualization/ovstage-render-and-camera.md11.0 KiB
- references/cae-cfd-visualization/ovui-controls.md13.2 KiB
- references/cae-cfd-visualization/rtwt-blueprint-recreation.md11.9 KiB
- references/cae-cfd-visualization/streaming-cae-viewer.md25.9 KiB
- references/cae-cfd-visualization/temporal-playback.md9.2 KiB
- references/cae-cfd-visualization/usd-authoring-and-materials.md21.5 KiB
- references/cae-cfd-visualization/volume-rendering.md2.5 KiB
- references/camera-auto-select/README.md9.0 KiB
- references/camera-controls/README.md20.9 KiB
- references/camera-picker/README.md9.5 KiB
- references/cloud-assets/README.md4.5 KiB
- references/cloud-deployment/README.md19.6 KiB
- references/cloud-deployment/container-image-build.md2.2 KiB
- references/cloud-deployment/gpu-container-runtime.md2.8 KiB
- references/cloud-deployment/nvcf-self-hosted.md8.4 KiB
- references/cloud-deployment/nvcf-viewer-container-contract.md4.8 KiB
- references/cloud-deployment/webrtc-network-diagnostics.md3.9 KiB
- references/cloudxr-opaque-data-channel/README.md1.1 KiB
- references/conventions.md7.4 KiB
- references/cpp-native-viewer/README.md4.9 KiB
- references/cpp-native-viewer/build-details.md5.2 KiB
- references/cpp-native-viewer/interaction-features.md11.3 KiB
- references/cpp-native-viewer/presentation-loop.md8.0 KiB
- references/cpp-native-viewer/project-build.md3.4 KiB
- references/cpp-native-viewer/renderer-session.md7.1 KiB
- references/cpp-native-viewer/validation.md3.4 KiB
- references/dependencies/README.md6.8 KiB
- references/dependencies/electron-shm.md1.5 KiB
- references/dependencies/environment-validation.md6.6 KiB
- references/dependencies/frontend.md2.3 KiB
- references/dependencies/local-openusd-gpu.md8.7 KiB
- references/dependencies/nvidia-runtime.md14.8 KiB
- references/dependencies/ovrtx.md3.1 KiB
- references/dependencies/ovstream.md3.3 KiB
- references/dependencies/ovxr.md2.3 KiB
- references/dependencies/quick-setup.md2.6 KiB
- references/dependencies/skia-yoga.md936 B
- references/electron-shm-viewer/README.md2.5 KiB
- references/electron-shm-viewer/architecture-project.md6.3 KiB
- references/electron-shm-viewer/electron-client.md6.5 KiB
- references/electron-shm-viewer/protocol-interaction-lifecycle.md7.9 KiB
- references/electron-shm-viewer/python-shm-server.md5.5 KiB
- references/electron-shm-viewer/validation.md2.8 KiB
- references/exact-brep-in-usd/README.md2.5 KiB
- references/gl-viewport-overlay/README.md8.0 KiB
- references/gl-viewport-overlay/architecture.md4.1 KiB
- references/gl-viewport-overlay/example-gizmo.md5.5 KiB
- references/gl-viewport-overlay/interaction-pattern.md4.0 KiB
- references/gl-viewport-overlay/projection-alignment.md4.3 KiB
- references/headless-shm-cli/README.md12.3 KiB
- references/huggingface-usd/README.md7.7 KiB
- references/interaction-round-trip/README.md40.1 KiB
- references/local-viewer/README.md17.8 KiB
- references/native-picking-selection/README.md13.1 KiB
- references/navigation-presets/README.md4.6 KiB
- references/navigation-presets/preset-camera-ops.md5.1 KiB
- references/newton-physics/README.md8.8 KiB
- references/object-selection/README.md11.1 KiB
- references/ovrtx-rendering/README.md23.0 KiB
- references/ovstage-data-plane/README.md3.5 KiB
- references/ovstage-live-geometry/README.md3.3 KiB
- references/ovstage-ovrtx-integration/README.md5.0 KiB
- references/ovstage-population/README.md3.7 KiB
- references/ovstage-runtime/README.md3.1 KiB
- references/ovui-library/README.md3.3 KiB
- references/ovui-library/api-reference.md4.3 KiB
- references/ovui-library/extending.md4.8 KiB
- references/ovui-local-viewer-recipe/README.md4.7 KiB
- references/ovui-local-viewer-recipe/interaction-features.md16.9 KiB
- references/ovui-local-viewer-recipe/project-structure.md6.2 KiB
- references/ovui-local-viewer-recipe/setup-shell-renderer.md16.4 KiB
- references/ovui-local-viewer-recipe/validation-build-order.md6.1 KiB
- references/ovwidgets-editor-shell/README.md5.4 KiB
- references/ovxr-composition-ui-validation/README.md7.1 KiB
- references/ovxr-composition-ui-validation/evidence-gates.md3.5 KiB
- references/ovxr-composition-ui-validation/frustum-placement.md2.4 KiB
- references/ovxr-composition-ui-validation/library-only-validation.md8.1 KiB
- references/ovxr-composition-ui-validation/owned-orchestration.md5.3 KiB
- references/ovxr-composition-ui-validation/viewer-evidence.md4.0 KiB
- references/ovxr-composition-ui/README.md8.5 KiB
- references/ovxr-composition-ui/async-raster-pipeline.md5.0 KiB
- references/ovxr-composition-ui/compositor-passes-and-sync.md6.4 KiB
- references/ovxr-composition-ui/depth-tools.md5.0 KiB
- references/ovxr-composition-ui/editor-document-model.md4.8 KiB
- references/ovxr-composition-ui/experience-quality.md8.5 KiB
- references/ovxr-composition-ui/foveation-and-edge-math.md3.5 KiB
- references/ovxr-composition-ui/library-only-compositor.md10.4 KiB
- references/ovxr-composition-ui/native-build-and-discovery.md4.6 KiB
- references/ovxr-composition-ui/performance-and-telemetry.md7.9 KiB
- references/ovxr-composition-ui/primary-projection-compositor.md3.5 KiB
- references/ovxr-composition-ui/primary-projection.md4.1 KiB
- references/ovxr-composition-ui/projection-and-depth.md5.3 KiB
- references/ovxr-composition-ui/raster-abi.md3.0 KiB
- references/ovxr-composition-ui/sdk-frame-backend.md1.6 KiB
- references/ovxr-composition-ui/skia-yoga.md2.8 KiB
- references/ovxr-composition-ui/spatial-interaction.md5.6 KiB
- references/ovxr-composition-ui/spatial-surfaces-and-interaction.md10.4 KiB
- references/ovxr-composition-ui/telemetry-contract.md3.8 KiB
- references/ovxr-composition-ui/validation-and-live-gates.md3.9 KiB
- references/ovxr-foveation-and-display/README.md1.1 KiB
- references/ovxr-frame-loop-and-readback/README.md1.2 KiB
- references/ovxr-library-runtime/README.md1.1 KiB
- references/ovxr-library-runtime/ar-compositing.md4.4 KiB
- references/ovxr-library-runtime/frame-input-order.md2.2 KiB
- references/ovxr-library-runtime/library-only.md1.1 KiB
- references/ovxr-library-runtime/live-ar-controls.md4.3 KiB
- references/ovxr-library-runtime/mirror-lifetime.md4.1 KiB
- references/ovxr-library-runtime/settings-and-lifetime.md3.9 KiB
- references/ovxr-library-runtime/viewer-assembly.md225 B
- references/ovxr-openxr-runtime/README.md1012 B
- references/ovxr-python-interactions/README.md1.8 KiB
- references/ovxr-python-interactions/architecture.md5.5 KiB
- references/ovxr-python-interactions/feature-patterns.md7.4 KiB
- references/physics-simulation/README.md7.1 KiB
- references/prim-info-display/README.md10.9 KiB
- references/prim-pick-effects/README.md7.3 KiB
- references/prim-transform-safety/README.md8.6 KiB
- references/realtime-sim-integration/README.md7.0 KiB
- references/render-settings/README.md12.6 KiB
- references/routing.md37.7 KiB
- references/section-views/README.md5.8 KiB
- references/seg-outline-highlight/README.md1.5 KiB
- references/selection-animation/README.md5.0 KiB
- references/selection-feedback/README.md7.5 KiB
- references/smlib-brep-pitfalls/README.md2.5 KiB
- references/spg-processing/README.md8.0 KiB
- references/stage-attribute-reads/README.md6.2 KiB
- references/stage-hierarchy/README.md20.3 KiB
- references/stage-hierarchy/fallback-worker-protocol.md7.4 KiB
- references/stage-loading/README.md7.1 KiB
- references/stage-management/README.md6.6 KiB
- references/stage-queries/README.md6.1 KiB
- references/streaming-client/README.md25.6 KiB
- references/streaming-lifecycle/README.md4.6 KiB
- references/streaming-messages/README.md19.5 KiB
- references/streaming-messages/server-handler-map.md3.1 KiB
- references/streaming-server/README.md17.7 KiB
- references/streaming-server/frame-loop-and-continuity.md3.8 KiB
- references/streaming-viewer-recipe/README.md1.9 KiB
- references/streaming-viewer-recipe/client-protocol.md14.2 KiB
- references/streaming-viewer-recipe/interaction-features.md13.8 KiB
- references/streaming-viewer-recipe/project-structure.md7.3 KiB
- references/streaming-viewer-recipe/server-runtime.md20.2 KiB
- references/streaming-viewer-recipe/validation-build-order.md8.5 KiB
- references/streaming-vs-local/README.md9.4 KiB
- references/stylized-visualization/README.md8.7 KiB
- references/stylized-visualization/aov-guide-contracts.md8.1 KiB
- references/stylized-visualization/implementation.md11.4 KiB
- references/stylized-visualization/line-compositor-delivery.md7.7 KiB
- references/stylized-visualization/mesh-xray.md10.1 KiB
- references/stylized-visualization/reproduction-validation.md10.2 KiB
- references/stylized-visualization/style-composition-contract.md5.4 KiB
- references/stylized-visualization/style-recipes.md14.7 KiB
- references/stylized-visualization/usd-brep-source.md4.9 KiB
- references/subprocess-geometry-bridge/README.md3.5 KiB
- references/tauri-local-viewer/README.md6.7 KiB
- references/tauri-shm-transform-gizmo/README.md12.3 KiB
- references/transform-manipulator/README.md17.1 KiB
- references/troubleshooting/README.md11.2 KiB
- references/troubleshooting/scenario-playbooks.md24.7 KiB
- references/usd-sample-data/README.md12.0 KiB
- references/usd-viewer-app/README.md5.0 KiB
- references/validation.md6.3 KiB
- references/viewer-backend-interface/README.md20.1 KiB
- references/viewer-control-patterns/README.md4.8 KiB
- references/viewer-data-view-patterns/README.md5.6 KiB
- references/viewer-feedback-status/README.md5.0 KiB
- references/viewer-input-routing/README.md11.9 KiB
- references/viewer-layout-patterns/README.md4.7 KiB
- references/viewer-ux-workflow/README.md5.2 KiB
- references/viewport-overlays/README.md9.9 KiB
- references/viewport-overlays/cuda-compositing.md6.6 KiB
- references/viewport-resize/README.md4.0 KiB
- references/vulkan-compositing/README.md6.1 KiB
- references/vulkan-compositing/depth-overlays.md15.7 KiB
- references/vulkan-compositing/interop-and-lifecycle.md6.6 KiB
- references/webgl-shm-transport/README.md14.5 KiB
- references/windows-native-setup/README.md11.6 KiB
- references/xr-client-connection/README.md1.1 KiB
- references/xr-client-message-contract/README.md8.5 KiB
- references/xr-desktop-mirror/README.md13.8 KiB
- references/xr-session-modes-and-passthrough/README.md930 B
- references/xr-spatial-input/README.md2.3 KiB
- references/xr-spatial-input/advanced-tools.md5.2 KiB
- references/xr-spatial-input/controllers.md16.3 KiB
- references/xr-spatial-input/feature-validation.md4.9 KiB
- references/xr-spatial-input/gesture-arbitration.md4.9 KiB
- references/xr-spatial-input/gesture-filtering.md5.5 KiB
- references/xr-spatial-input/hand-recognizers.md4.0 KiB
- references/xr-spatial-input/hands.md10.3 KiB
- references/xr-spatial-input/navigation.md13.5 KiB
- references/xr-spatial-input/physics-interaction.md23.2 KiB
- references/xr-spatial-input/simulation-lifecycle.md5.9 KiB
- references/xr-spatial-input/stage-composition.md4.9 KiB
- references/xr-spatial-input/teleport-acceptance.md5.2 KiB
- references/xr-spatial-input/webxr-client.md3.9 KiB
- references/xr-tracking-anchor-and-scale/README.md950 B
- references/xr-viewer-recipe/README.md10.5 KiB
- skill-card.md7.7 KiB
- skill.oms.sig58.2 KiB
references/ovrtx-rendering/README.md
ovrtx Rendering
Triggers
Use this skill for ovrtx, renderer.step, step_async, attach_ovstage, update_from_stage, committed render ordinals, LdrColor, AOVs, render vars, HdrColor, NormalSD, RenderProduct resolution, standalone write_attribute, omni:xform, OVRTX_BIN_PATH, magenta materials, or RenderApi errors.
ovrtx is a headless RTX renderer driven from Python. The app owns the render loop, frame extraction, and any streaming/display handoff. For new ovrtx viewer apps, OVStage owns scene population, hierarchy, runtime attributes, transforms, material/effect writes, and write-floor publication; ovrtx attaches to that stage and renders committed ordinals. Use direct ovrtx stage and attribute APIs only for standalone compatibility paths or projects intentionally pinned to the older renderer-owned stage model.
For ovrtx renderer behavior, Python/C API behavior, release notes, or behavior
not covered here, read references/dependencies for acquisition guidance and
supplemental dependency documentation.
Core API
import os
os.environ.setdefault("OVRTX_SKIP_USD_CHECK", "1")
import ovrtx
# Stage-first attached mode: publish OVRTX schema paths before OVStage or any
# other OpenUSD consumer initializes. Importing ovrtx alone does not do this.
ovrtx.register_schema_paths()
import ovstage
from ovstage import PopulationDomain, population
from ovrtx import Renderer, RendererConfig
stage = ovstage.Stage("viewer")
ordinal = 1
population.open_usd(stage, "/path/to/composite.usda", ordinal=ordinal, domains=PopulationDomain.RENDERING)
stage.advance_write_floor(ordinal).wait()
# Create the renderer and attach the published stage.
renderer = Renderer(config=RendererConfig(
sync_mode=True,
active_cuda_gpus="0",
keep_system_alive=True,
))
print(renderer.version)
renderer.attach_ovstage(stage)
products = renderer.step(
render_products={"/Session/Render/Viewport"},
delta_time=1.0 / 60.0,
ordinal=ordinal,
)
product = products["/Session/Render/Viewport"]sync_mode=True blocks until the GPU frame is complete. Async pipelines can use False, but then buffer lifetime and frame readiness need explicit care.
renderer.attach_ovstage(stage) attaches a live, externally owned
ovstage.Stage. Keep that Stage alive until renderer.detach_ovstage() or
renderer destruction. When a stage is attached, renderer.step(..., ordinal=N)
requires an ordinal and first updates the renderer through at least that
committed OVStage publication. A separate renderer.update_from_stage(N) is
only needed when the app must update renderer state before a step, such as
pre-step sensor or status work.
Call ovrtx.register_schema_paths() before constructing or first populating an
OVStage (and before any other OpenUSD runtime initializes). In current OVRTX,
this registers the RTX schema families with OVStage so populated schema
fallbacks resolve. An OVStage instance can be attached to only one live OVRTX
renderer. Renderer replacement must follow the
attached-stage lifetime guidance,
including the payload limitation on affected builds.
renderer.step() returns a mapping-like RenderProductSetOutputs, indexed by
RenderProduct path; it is not a context manager. Map each needed RenderVar with
with render_var.map(...) as mapping: and copy the pixels inside that context.
Consume the results inside the frame loop and release references once the
required outputs have been copied.
renderer.step_async() enqueues the same frame work and returns an Operation. Poll op.query_status() from the runtime owner when you need the render loop to stay responsive, then call op.wait() before reading RenderProductSetOutputs. Do not mutate OVStage or the standalone renderer stage while a step operation is in flight.
OVStage And Standalone Composition
ovrtx supports two scene-ownership modes:
Attached mode for new apps: create an
ovstage.Stage; load composed USD withovstage.population.open_usd(...)oropen_usd_from_string(...); apply reference, reset, time, hierarchy, transform, material, and effect changes through OVStage; wait for the operation; advance the write floor; then render withrenderer.step(..., ordinal=N).Standalone compatibility mode:
renderer.open_usd*,add_usd_reference*,remove_usd(),reset_stage(),query_prims*,read_attribute*,write_attribute*,bind_attribute*, andmap_attribute()operate on a renderer-owned stage. These APIs remain useful for compatibility and focused standalone tests, but they are deprecated in ovrtx for production scene ownership.
Do not use older implicit stage-addition APIs as the main load path. Do not mix OVStage writes with direct renderer stage writes for the same runtime state; pick one owner per app path.
Frame Extraction
products = renderer.step(render_products={RENDER_PRODUCT_PATH}, delta_time=dt, ordinal=ordinal)
if RENDER_PRODUCT_PATH in products:
product = products[RENDER_PRODUCT_PATH]
for frame in product.frames:
# Output identity is the full authored RenderVar prim path.
ldr_path = "/Session/Render/Vars/LdrColor"
if ldr_path in frame.render_vars:
with frame.render_vars[ldr_path].map(device=Device.CUDA) as rv:
rv.wait() # Establish producer completion before Warp consumption.
rgba_cuda = wp.from_dlpack(rv) # borrowed H x W x 4 view
wp.copy(owned_rgba_cuda, rgba_cuda)
wp.synchronize_stream() # Copy must finish before unmap.
with frame.render_vars[ldr_path].map(device=Device.CPU) as rv:
pixels = np.from_dlpack(rv).copy() # H x W x 4 RGBACUDA mapping avoids a host transfer; CPU mapping copies to host. The mapped
object implements DLPack directly for a single-tensor output such as LdrColor.
For multi-tensor outputs, select names (rv["Coordinates"], rv["Intensity"])
and read scalar params through rv.params.
Frame lifetime and synchronization
Keep step outputs alive while obtaining maps. DLPack consumers retain their mapped backing storage, so copy frames into app-owned storage for UI and transport queues rather than retaining renderer buffers.
GPU handoff has two completion points: wait for rendering before reading the
mapping, then finish the consumer's reads before releasing it. The example uses
rv.wait() and a consumer-stream wait for a simple synchronous copy. To keep
work asynchronous, use rv.wait_on(consumer_stream_handle) and
rv.unmap(stream=consumer_stream_handle) or unmap(event=completion_event) with
the actual consuming CUDA stream/event. Preserve destination-buffer ownership
until the display or encoder finishes with it.
For C consumers, ovrtx_map_render_var_output() exposes named tensors[] and
params[]; interpret them using the selected RenderVar's contract.
Render Product Resolution
Set the viewer-owned RenderProduct resolution in the session or composite layer before loading the stage. The render product path must be the same path passed to renderer.step(render_products={...}).
Use a fixed render size with browser object-fit: contain by default. For an
explicit resize feature, update the authored resolution through the stage API
and follow streaming-server/frame-loop-and-continuity.md for the resizable
transport contract; verify actual output dimensions before submission.
Render Vars And AOVs
The render product controls which AOVs ovrtx attempts to produce:
def RenderProduct "ViewportTexture0"
{
rel camera = </OVCamera>
rel orderedVars = [</Render/Vars/LdrColor>]
}
def RenderVar "LdrColor"
{
uniform string sourceName = "LdrColor"
}Basic generated viewers should request only LdrColor until an explicit
AOV/debug-view feature needs additional outputs. Add HDR, depth, normal,
segmentation, or other debug AOVs together with the conversion, UI, and
validation rules from aov-switching and render-settings.
frame.render_vars is keyed by the full authored RenderVar prim path, not by
the prim name or sourceName. For example, a RenderVar "Normal" at
/Render/Vars/Normal with sourceName = "NormalSD" appears under
/Render/Vars/Normal. Keep source_name only as the friendly AOV category
used for UI and conversion selection. Build a source_name →
render_var_path mapping from the frame outputs when the wrapper does not
author stable paths itself only if the viewer enforces one RenderVar per source
name. Otherwise, make the full render_var_path the UI option identity and
carry source_name only as display metadata.
Common displayable AOVs for viewer apps:
| AOV key | Tensor | Notes |
|---|---|---|
LdrColor | uint8 [H,W,4] | Tonemapped RGBA; swap R/B for ovstream BGRA |
HdrColor | uint16 [H,W,4] | Linear HDR exposed as fp16 bits in uint16; display with approximate tonemap |
NormalSD | float32 [H,W,4] | World-space surface normals (XYZA) |
InstanceSegmentationSD | uint32 [H,W,1] | Instance IDs; display/debug AOV, colorize for inspection |
SemanticSegmentationSD | uint32 [H,W,1] | Semantic IDs; display/debug AOV, colorize for inspection |
All image tensors are channel-last [H, W, C]; scalar lanes are [H, W, 1], not [H, W]. Request only the render vars the feature uses, and expose them only after they map to real non-empty data.
Displaying other AOVs
Keep output identity as the RenderVar path and offer only outputs that map to
valid full-resolution data. Presence in frame.render_vars alone does not prove
that an output is displayable. Convert the selected output on GPU into the
transport's app-owned display buffer.
Use aov-switching for availability state, dtype conversion, and UI messages. Its output selection is independent of the chosen local or streamed presentation shell.
Runtime Attribute Writes
For new ovrtx applications, make OVStage the runtime data plane for
transforms, camera motion, material/effect controls, visibility changes, and
other stage-data state. Direct renderer.write_attribute() and
bind_attribute() are compatibility APIs for standalone renderer-owned stages,
not the source of truth when an OVStage is attached. Renderer-owned selection
outline group/style writes remain ovrtx responsibilities; route them through
native-picking-selection.
OVStage writes are ordinal-keyed. Wait for the write, advance the write floor, then render that committed ordinal:
import numpy as np
from ovstage import (
AttributeSemantic,
DLDataType,
DLDataTypeCode,
PrimMode,
make_dltensor,
)
ordinal += 1
matrices = np.asarray([...], dtype=np.float64).reshape(len(paths), 16)
xform_tensor = make_dltensor(
matrices,
dtype=DLDataType(code=DLDataTypeCode.kDLFloat, bits=64, lanes=16),
shape=[len(paths)],
)
stage.write_attribute(
query,
"omni:xform",
ordinal=ordinal,
tensors=xform_tensor,
is_array=False,
semantic=AttributeSemantic.MATRIX,
prim_mode=PrimMode.UPSERT,
).wait()
stage.advance_write_floor(ordinal).wait()
products = renderer.step({RENDER_PRODUCT_PATH}, delta_time=dt, ordinal=ordinal)omni:xform matrices are row-major float64 matrices using the USD row-vector
convention, with translation in row [3][0..2]. In OVStage DLPack form, a
matrix write input is one 16-lane element per prim (shape=[N], lanes 16).
OVStage read/map outputs use scalar lanes and explicit [N,4,4] shape/strides;
map-creation dtypes remain lane-based. See the data plane.
For standalone compatibility paths, ovrtx consumes Fabric attributes such as
omni:xform; standard authored USD xformOp:* is not the live renderer update
path.
import ovrtx
xforms = np.array([...], dtype=np.float64).reshape(n, 4, 4)
renderer.write_attribute(
prim_paths=paths,
attribute_name="omni:xform",
tensor=xforms,
semantic=ovrtx.Semantic.XFORM_MAT4x4,
prim_mode=ovrtx.PrimMode.CREATE_NEW,
data_access=0, # 0=ASYNC for GPU tensors, 1=SYNC for CPU numpy
)ovrtx.PrimMode.EXISTING_ONLY silently skips attributes not already registered. Use ovrtx.PrimMode.CREATE_NEW for compatibility camera, animation, and EffectLayer attributes that may not exist in Fabric yet. This is a different enum from ovstage.PrimMode; OVStage examples usually use ovstage.PrimMode.UPSERT for app-owned runtime state.
Renderer Config And Process State
Set renderer-wide behavior at construction time:
sync_mode=Truekeepsstep()blocking until the frame is complete. Usestep_async()for responsive loops that can poll anOperation.active_cuda_gpus="0"or"0,1"restricts which CUDA-visible devices ovrtx can use. Values are indices intoCUDA_VISIBLE_DEVICES.keep_system_alive=Truekeeps the ovrtx system initialized across idle/reset periods. Choose it at renderer creation.
Set enable_minimal, enable_realtimepathtracing and enable_pathtracing
on the first renderer in the process. Conflicting explicit choices on later
instances fail. Selecting a RenderProduct mode does not disable the other
startup modes or recover their initialization cost. Spectral preparation
(enable_spectral_rendering) is also a first-renderer, process-lifetime choice.
MDL displacement (enable_mdl_displacement) is configured at renderer creation
and writes process-wide state; do not present it as an ordinary per-viewer live
toggle. Resolve defaults and supported combinations from upstream
renderer configuration.
The ovrtx logging callback is process-global state, not renderer-owned state. Install it once during process startup if the app needs to route ovrtx logs into its logger. Avoid registering a different callback per request, per viewer tab, or per renderer instance; in multi-viewer processes the last process-global registration is the one that matters.
First-Run Shader Compilation
The first renderer.step() on a cold machine or fresh cache can take 2-5 minutes while RTX pipelines and shaders compile. Treat this as a normal first-run cost before assuming the process is hung.
Use a longer timeout for first validation and CI runs, at least 300 seconds for the first rendered frame. Check the ovrtx log for shader or pipeline compilation progress before killing the process. GPU utilization can show 0% during parts of shader compilation because the work may be CPU-side, driver-side, or CUDA compute rather than graphics utilization.
Subsequent steps are usually fast once the shader cache is populated. If every run pays the full cold-start cost, check the local cache configuration in dependencies and make sure the cache directory is writable and persistent for the intended environment.
Schema Registration And Path Dictionary
OVStage and standalone ovrtx runtime population are schema-driven. Built-in stage data such as Cameras, RenderProducts, RenderVars, omni:xform, pickability, and selection-outline attributes use supported schemas. If an app depends on custom authored attributes, register the schema before loading the stage, or opt in with root-layer customLayerData.populateAllAuthoredAttributes = true when broad authored-attribute population is acceptable. The broad flag can significantly increase memory usage.
Path and token IDs returned by C queries or pick-hit buffers are not user-facing
strings. In attached mode, decode OVStage query/read/write IDs with the
OVStage-owned path dictionary and decode ovrtx pick/render-output IDs with the
renderer-owned dictionary. Do not use one library's dictionary for IDs produced
by the other. Python pick-hit decoding uses Renderer.resolve_prim_path_id().
For picking and selection-outline implementation, read native-picking-selection
before writing code. Use Renderer.enqueue_pick_query() with normalized
top-left RenderProduct bounds, Renderer.resolve_prim_path_id(int_id),
Renderer.set_selection_group_styles({group_id: SelectionGroupStyle(...)}), and
Renderer.set_selection_outline_group_strings(...). A consumed native query
produces OVRTX_RENDER_VAR_PICK_HIT automatically; do not author it in USD
orderedVars. Do not replace these with hasattr-driven picker fallbacks unless
native picking is unavailable and the user explicitly asks for a compatibility
path.
Geometry Streaming
For USD assets in new ovrtx apps, prefer OVStage population and
population.add_usd_reference* composition. Use geometry streaming only for
runtime-generated geometry or high-frequency geometry updates that are owned by
the application. Keep schemas registered before streaming attributes, keep
stream ownership/lifetime explicit, and continue to render with ovrtx; do not
replace this with browser-side geometry rendering.
Multi-GPU
RendererConfig(active_cuda_gpus="0,1") enables multiple CUDA-visible GPUs for rendering, subject to the installed ovrtx build and RenderProduct configuration. Per-RenderProduct uint[] deviceIds = [...] is an allow-list into CUDA_VISIBLE_DEVICES; use it when a product must run on a specific device.
For WebRTC streaming and Warp conversion, keep the selected display RenderProduct on the CUDA device used by the stream buffer or add an explicit copy. Picking currently requires the picking RenderProduct to run on CUDA-visible GPU 0; pin pick products with deviceIds = [0] when multi-GPU rendering is enabled.
Environment
export OVRTX_SKIP_USD_CHECK=1
export OVRTX_BIN_PATH="$(python3 -c 'import ovrtx, os; print(os.path.join(os.path.dirname(ovrtx.__file__), "bin"))')"
export LD_LIBRARY_PATH="$OVRTX_BIN_PATH/plugins${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}"If a separate USD build is present, ovrtx's bundled USD/plugins must resolve first or USD debug symbols can be registered twice (SDF_ASSET fatal errors).
Import Order
Use one import discipline per process:
Attached OVStage viewer (the default for new apps): set
OVRTX_SKIP_USD_CHECK, importovrtx, callovrtx.register_schema_paths(), then create/populate OVStage before any other OpenUSD consumer initializes. This ordering wins over convenience import-order guidance for non-attached shells.Streaming/direct ovrtx server: set
OVRTX_SKIP_USD_CHECK, constructRenderer, then importpxrif direct queries are needed.Verified in-process OpenUSD viewer/editor paths: import
pxrfirst, then let local renderer/adapter code import ovrtx as documented inlocal-viewerand ovui guidance.Windows streaming path: keep
pxrin a subprocess; do not import it in the ovrtx process.
The reason is USD plugin registry ownership. Mixing usd-core and ovrtx's bundled USD in the wrong order can cause MDL resolver failures, _tf DLL import failures, or duplicate symbol crashes.
Minimal Render Example
import os
os.environ["OVRTX_SKIP_USD_CHECK"] = "1"
import numpy as np
import ovrtx
ovrtx.register_schema_paths()
import ovstage
from PIL import Image
from ovstage import PopulationDomain, population
from ovrtx import Renderer, RendererConfig, Device
stage = ovstage.Stage("viewer")
ordinal = 1
population.open_usd(stage, "/path/to/composite.usda", ordinal=ordinal, domains=PopulationDomain.RENDERING)
stage.advance_write_floor(ordinal).wait()
renderer = Renderer(config=RendererConfig(sync_mode=True))
renderer.attach_ovstage(stage)
for _ in range(60):
products = renderer.step(
render_products={"/Render/RenderProduct"},
delta_time=1/60,
ordinal=ordinal,
)
product = products["/Render/RenderProduct"]
for frame in product.frames:
ldr_path = "/Render/Vars/LdrColor"
if ldr_path in frame.render_vars:
with frame.render_vars[ldr_path].map(device=Device.CPU) as rv:
rv.wait()
Image.fromarray(np.from_dlpack(rv).copy()).save("output.png")MDL Material Resolution
ovrtx bundles MDL assets under ovrtx/bin/library/mdl/, including Base/OmniPBR.mdl, Base/OmniGlass.mdl, and mdl/nvidia/core_definitions.mdl. Without OVRTX_BIN_PATH pointing at ovrtx/bin, materials importing ::OmniPBR::OmniPBR or ::nvidia::core_definitions::* can render magenta.
UJITSO "multi-node material unsupported" warnings are informational if the full MDL compiler can find the library. They become a problem when OVRTX_BIN_PATH or LD_LIBRARY_PATH is wrong.
Common Errors
| Symptom | Cause | Fix |
|---|---|---|
CRenderApi not found | plugin tree missing | set OVRTX_BIN_PATH |
multiple debug symbol definitions for SDF_ASSET | two USD instances | put ovrtx bundled libs first |
usd-core detected | version check conflict | set OVRTX_SKIP_USD_CHECK=1 |
Default.mdl parse crash | renderer initialized after wrong USD registry | fix import/construction order |
RenderProductSetOutputs has no .get | treated the result as a Python dict | use membership checks and products[path] |
| invalid output handle after returning frame data | renderer-backed output was retained past its valid lifetime | return an owned copy made inside the RenderVar map context |
first renderer.step() appears hung | cold RTX shader or pipeline compilation | use a 300s+ first-run timeout and inspect ovrtx logs |
write_attribute does nothing | used direct renderer writes in an attached-stage app, or missed compatibility prim mode | write through OVStage at a new ordinal; for standalone compatibility use PrimMode.CREATE_NEW |
| transform not visible | wrote authored xformOp:*, used wrong matrix layout, or rendered above the write floor | write omni:xform through OVStage as a row-major 16-lane matrix, advance the floor, then step with that ordinal |
Semantic.XFORM_MAT4x4 becomes NONE | imported adapter implementation module _ovrtx | import ovrtx directly |
| single-tensor examples fail or hide data | current render vars can be multi-tensor | use np.from_dlpack(rv) or named tensors such as rv["TensorName"] |
| AOV listed but blank | ovrtx produced empty tensor | enable PT flags, check the full RenderVar path and source name |
DepthSD mapping fails | deprecated depth AOV | use DistanceToImagePlaneSD for axial depth or DistanceToCameraSD for radial distance; update the UI label accordingly |
Diffuse empty/fails | wrong source name | use DiffuseAlbedoSD not Diffuse |
Roughness mapping fails | unsupported in current ovrtx build | do not expose |
| red/blue swapped in browser | streamed RGBA directly | convert to BGRA before stream_video() |
| magenta materials | MDL resolver path missing | set OVRTX_BIN_PATH and plugin LD_LIBRARY_PATH |
| stale hangs | old GPU process | inspect nvidia-smi, kill stale Omniverse Realtime Viewer PIDs |
See also: aov-switching, stage-loading, camera-controls, render-settings, selection-feedback, selection-animation, streaming-server.
Processed GPU outputs
For custom post-processing, chained resources or lens sampling, read SPG processing. For stylized image passes, technical/X-Ray geometry strokes or explicit full wireframe, continue to stylized visualization. Present the actual published processed output through this viewer's existing owner and transport; a menu selection or display conversion alone does not implement the effect.
Requirements and compatibility
Works with: Claude Code, Claude apps, OpenAI Codex, GitHub Copilot, Cursor, Gemini CLI, Kiro, OpenCode, Goose, Amp, Roo Code, JetBrains Junie, Factory Droid, Devin (ex-Windsurf), Mistral Vibe, OpenHands, Letta
“Works with” means the tool reads the open Agent Skills format; a skill written for one tool may use features others lack.
Needs: Needs Python, Needs Node.js
The author says: Orchestrator skill. Downstream focused references may require NVIDIA GPUs, ovrtx, ovstream, ovui, OpenUSD, Python, Node/React, Tauri, Electron, C++, or cloud GPU deployment access depending on the selected viewer path.
Security
What our scanner noticed· Medium risk
- Large base64-encoded blobs
- Instructions that use the network
A static scan is not a guarantee. Skills are third-party content: review a skill before you let an agent use it.
Attribution and licence
- Created by
- NVIDIA Omniverse
- Publisher
- NVIDIA (Official)
- Source
- NVIDIA/skills · skills/omniverse-realtime-viewer · commit fce3cca
- Licence
- Apache License 2.0 (redistribution allowed)
- LICENSE (added by AutoGineer from LICENSE-APACHE)
- ATTRIBUTION.md (written by AutoGineer)
- Synced
AutoGineer is not affiliated with or endorsed by NVIDIA Omniverse or NVIDIA.
Download ZIP
The ZIP holds the skill’s files, its licence files and an ATTRIBUTION.md. Download omniverse-realtime-viewer.zip