Omniverse Realtime Viewer
OpenAIOfficialCreated by NVIDIA OmniverseDistributed by OpenAI
- Skill
- Meta (authoring, orchestration, planning, memory)
- 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 orchestrator for developing USD-based viewer applications. It provides a structured approach to selecting implementation recipes, enforcing architectural conventions, and managing dependencies. By utilizing a set of focused reference documents, it guides developers through the lifecycle of building, configuring, and validating viewer applications, ensuring consistent behavior across different delivery paths such as local workstations or streaming environments.
What it does
- Routes development requests to specific implementation recipes based on the target delivery path.
- Enforces architectural rules for USD rendering, stage management, and UI integration.
- Provides guidance on camera selection, input handling, and viewport interaction.
- Standardizes the integration of AOV switching and render product configuration.
- Facilitates the capture of validation evidence for viewer readiness.
- Maintains separation between user-provided USD files and application-specific session state.
When to use it
- When initiating the development of a new USD viewer application within the Omniverse ecosystem.
- When determining the appropriate delivery path for a viewer, such as local native or streaming.
- When needing to implement consistent camera, selection, or UI behavior across viewer projects.
- When integrating advanced rendering features like AOV switching into an existing viewer.
Advantages
- Ensures architectural consistency across diverse viewer implementations.
- Provides a clear, modular path for adding specific capabilities like input routing or data display.
- Promotes clean separation of concerns between stage data and viewer-owned state.
- Standardizes the validation process for consistent delivery.
Usage examples
- “I need to build a browser-based viewer for USD files.”
- The agent will route you to the streaming viewer recipe, providing guidance on WebRTC stream setup, UI integration, and viewport interaction.
- “How do I implement AOV switching in my local USD viewer?”
- The agent will provide the AOV switching reference, detailing how to map render vars and update the display state on the server.
Install
Download the skill as a ZIP:
https://mp-staging.autogineer.com/agent-skills/openai/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
This is the top-level entry point for the Omniverse Realtime Viewer skill package. It is self-contained: all required routing, conventions, and validation guidance live in the selected references.
Use the focused reference documents as implementation recipes. This file chooses the right recipes and preserves the architectural rules that must hold across all generated viewer apps.
Instructions
Start by classifying the requested viewer, then read only the references needed
for that delivery path and feature set. Implement the render path first, layer
interaction and UI behavior on top of it, and finish by capturing validation
evidence from references/validation.md.
Read Order
Read
references/routing.mdto choose the delivery path and focused references.Read
references/conventions.mdbefore implementing camera, input, selection, viewport, streaming protocol, scene loading, or environment behavior.For broad viewer requests, read
references/usd-viewer-app/README.md.If the delivery path is unclear, read
references/streaming-vs-local/README.md.If the prompt includes layout, panels, controls, inspectors, status, or UX, read
references/viewer-ux-workflow/README.mdand then the focused viewer UI references. This applies to React/WebRTC, Tauri, Electron,ovui,ovwidgets, and Dear ImGui apps; "frontend" means user-facing UI, not only browser UI.For viewport interaction, read
references/viewer-input-routing/README.mdbeforereferences/camera-controls/README.md,references/native-picking-selection/README.md, orreferences/object-selection/README.md.Read only the focused capability references needed for the requested app.
Use
references/validation.mdto capture review evidence before handoff.
Non-Negotiables
Use
ovrtxfor all USD and 3D rendering.Browser apps display an
ovstreamWebRTC video stream plus UI. The browser does not render USD geometry.Do not substitute WebGL, Three.js, Babylon.js, PlayCanvas, A-Frame, model-viewer, react-three-fiber, glTF browser viewers, or other client-side 3D renderers.
If local validation cannot run because the GPU/runtime environment is absent, scaffold the
ovrtxpath and document the runtime requirement. Do not add a browser-renderer fallback.Keep user USD files unmodified. Viewer cameras, render products, render vars, settings, selection metadata, and runtime state belong in session/composite layers or app state.
Keep one owner for
renderer.step(), stage mutation, native picking, selection writes, and live attribute writes.Keep dependency acquisition in
references/dependencies/README.mdand deployment choices inreferences/cloud-deployment/README.md; do not duplicate package locations or deployment setup.
Focused Reference Families
Entry points and recipes:
references/usd-viewer-app/README.md,references/streaming-viewer-recipe/README.md,references/ovui-local-viewer-recipe/README.md,references/streaming-vs-local/README.md,references/electron-shm-viewer/README.md,references/ovwidgets-editor-shell/README.md.Rendering and stage:
references/ovrtx-rendering/README.md,references/stage-loading/README.md,references/stage-management/README.md,references/render-settings/README.md,references/aov-switching/README.md,references/stage-hierarchy/README.md,references/stage-queries/README.md,references/stage-attribute-reads/README.md,references/prim-transform-safety/README.md,references/usd-sample-data/README.md.Delivery and runtime:
references/streaming-server/README.md,references/streaming-client/README.md,references/streaming-messages/README.md,references/streaming-lifecycle/README.md,references/local-viewer/README.md,references/tauri-local-viewer/README.md,references/cpp-native-viewer/README.md,references/headless-shm-cli/README.md,references/viewer-backend-interface/README.md,references/webgl-shm-transport/README.md.Viewer UI/UX:
references/viewer-ux-workflow/README.md,references/viewer-layout-patterns/README.md,references/viewer-control-patterns/README.md,references/viewer-data-view-patterns/README.md,references/viewer-feedback-status/README.md.Interaction:
references/viewer-input-routing/README.md,references/camera-controls/README.md,references/object-selection/README.md,references/native-picking-selection/README.md,references/selection-feedback/README.md,references/selection-animation/README.md,references/transform-manipulator/README.md,references/gl-viewport-overlay/README.md,references/ovui-library/README.md,references/prim-pick-effects/README.md,references/prim-info-display/README.md,references/viewport-overlays/README.md.Infrastructure:
references/dependencies/README.md,references/windows-native-setup/README.md,references/cloud-assets/README.md,references/cloud-deployment/README.md,references/troubleshooting/README.md.
Build Workflow
Classify the prompt by delivery path, target user, required capabilities, runtime environment, validation needs, and explicit constraints.
Select a small reference set. Start with the recipe or routing reference, then add focused capabilities such as camera, picking, hierarchy, properties, render settings, transform tools, cloud assets, or deployment.
Read selected references before writing app code. Follow their build order, import order, data-channel contracts, and renderer ownership rules.
Implement the core render path first, then input routing and camera, then selection and data panels, then scene/settings features, then packaging or deployment.
Treat the selected references as the behavior contract for API shape, compatibility, and generated project structure.
Capture validation evidence before calling the viewer ready.
Examples
For a browser viewer request, use the streaming recipe references plus camera, picking, hierarchy, properties, render settings, and stream-status references.
For a local workstation viewer request, use the local or native delivery references plus renderer setup, stage loading, viewport input, and validation.
Completion Checklist
Selected references match the user's intent and delivery path.
No code path uses a browser-side 3D renderer for USD.
The generated app has one clear owner for render stepping and stage mutation.
User USD files remain untouched by viewer-owned session data.
Camera, input, selection, scene loading, and stream behavior follow
references/conventions.md.Setup/build/run results and visual interaction evidence are captured with
references/validation.md.
Files
- ATTRIBUTION.mdAdded by AutoGineer1.0 KiB
- BENCHMARK.md5.5 KiB
- LICENSEAdded by AutoGineer10.0 KiB
- SKILL.md7.4 KiB
- agents/openai.yaml315 B
- evals/evals.json8.1 KiB
- references/aov-switching/README.md15.2 KiB
- references/camera-auto-select/README.md7.4 KiB
- references/camera-controls/README.md17.1 KiB
- references/camera-picker/README.md9.7 KiB
- references/cloud-assets/README.md10.4 KiB
- references/cloud-deployment/README.md18.0 KiB
- references/conventions.md5.3 KiB
- references/cpp-native-viewer/README.md2.4 KiB
- references/cpp-native-viewer/interaction-features.md19.2 KiB
- references/cpp-native-viewer/presentation-loop.md9.0 KiB
- references/cpp-native-viewer/project-build.md6.4 KiB
- references/cpp-native-viewer/renderer-session.md4.5 KiB
- references/cpp-native-viewer/validation.md3.3 KiB
- references/dependencies/README.md3.4 KiB
- references/dependencies/electron-shm.md1.5 KiB
- references/dependencies/environment-validation.md4.4 KiB
- references/dependencies/frontend.md2.3 KiB
- references/dependencies/local-openusd-gpu.md4.4 KiB
- references/dependencies/nvidia-runtime.md9.0 KiB
- references/dependencies/ovrtx.md2.4 KiB
- references/dependencies/ovstream.md2.5 KiB
- references/dependencies/quick-setup.md5.3 KiB
- references/electron-shm-viewer/README.md2.2 KiB
- references/electron-shm-viewer/architecture-project.md6.3 KiB
- references/electron-shm-viewer/electron-client.md5.6 KiB
- references/electron-shm-viewer/protocol-interaction-lifecycle.md6.9 KiB
- references/electron-shm-viewer/python-shm-server.md4.9 KiB
- references/electron-shm-viewer/validation.md2.8 KiB
- references/gl-viewport-overlay/README.md7.9 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.2 KiB
- references/huggingface-usd/README.md7.7 KiB
- references/local-viewer/README.md15.0 KiB
- references/native-picking-selection/README.md10.4 KiB
- references/object-selection/README.md9.4 KiB
- references/ovrtx-rendering/README.md18.2 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.md3.7 KiB
- references/ovui-local-viewer-recipe/interaction-features.md16.1 KiB
- references/ovui-local-viewer-recipe/project-structure.md6.2 KiB
- references/ovui-local-viewer-recipe/setup-shell-renderer.md14.3 KiB
- references/ovui-local-viewer-recipe/validation-build-order.md5.5 KiB
- references/ovwidgets-editor-shell/README.md8.6 KiB
- references/prim-info-display/README.md9.3 KiB
- references/prim-pick-effects/README.md5.9 KiB
- references/prim-transform-safety/README.md8.2 KiB
- references/render-settings/README.md9.9 KiB
- references/routing.md16.5 KiB
- references/seg-outline-highlight/README.md1.4 KiB
- references/selection-animation/README.md9.7 KiB
- references/selection-feedback/README.md6.6 KiB
- references/stage-attribute-reads/README.md5.5 KiB
- references/stage-hierarchy/README.md17.1 KiB
- references/stage-hierarchy/fallback-worker-protocol.md3.5 KiB
- references/stage-loading/README.md19.3 KiB
- references/stage-management/README.md10.1 KiB
- references/stage-queries/README.md5.3 KiB
- references/streaming-client/README.md17.4 KiB
- references/streaming-lifecycle/README.md8.8 KiB
- references/streaming-messages/README.md16.5 KiB
- references/streaming-messages/server-handler-map.md3.1 KiB
- references/streaming-server/README.md18.6 KiB
- references/streaming-server/frame-loop-and-continuity.md3.3 KiB
- references/streaming-viewer-recipe/README.md4.8 KiB
- references/streaming-viewer-recipe/client-protocol.md11.0 KiB
- references/streaming-viewer-recipe/interaction-features.md13.0 KiB
- references/streaming-viewer-recipe/project-structure.md7.0 KiB
- references/streaming-viewer-recipe/server-runtime.md16.8 KiB
- references/streaming-viewer-recipe/validation-build-order.md5.8 KiB
- references/streaming-vs-local/README.md8.1 KiB
- references/tauri-local-viewer/README.md18.2 KiB
- references/tauri-shm-transform-gizmo/README.md11.8 KiB
- references/transform-manipulator/README.md15.0 KiB
- references/troubleshooting/README.md7.2 KiB
- references/troubleshooting/scenario-playbooks.md18.8 KiB
- references/usd-sample-data/README.md11.7 KiB
- references/usd-viewer-app/README.md7.5 KiB
- references/validation.md3.0 KiB
- references/viewer-backend-interface/README.md17.7 KiB
- references/viewer-control-patterns/README.md4.8 KiB
- references/viewer-data-view-patterns/README.md4.8 KiB
- references/viewer-feedback-status/README.md4.9 KiB
- references/viewer-input-routing/README.md7.8 KiB
- references/viewer-layout-patterns/README.md4.7 KiB
- references/viewer-ux-workflow/README.md4.6 KiB
- references/viewport-overlays/README.md4.8 KiB
- references/viewport-resize/README.md8.5 KiB
- references/webgl-shm-transport/README.md14.5 KiB
- references/windows-native-setup/README.md5.7 KiB
- skill-card.md2.9 KiB
- skill.oms.sig28.6 KiB
references/ovrtx-rendering/README.md
ovrtx Rendering
Triggers
Use this skill for ovrtx, renderer.step, step_async, LdrColor, AOVs, render vars, HdrColor, NormalSD, RenderProduct resolution, 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, camera updates, frame extraction, and any streaming/display handoff.
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
from ovrtx import Renderer, RendererConfig, Device, Semantic, PrimMode
renderer = Renderer(config=RendererConfig(
sync_mode=True,
active_cuda_gpus="0",
keep_system_alive=True,
))
print(renderer.version)
renderer.open_usd("/path/to/composite.usda")
products = renderer.step(render_products={"/Session/Render/Viewport"}, delta_time=1.0 / 60.0)
with products as ctx:
product = ctx["/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.step() returns RenderProductSetOutputs, not a Python dict. It supports [], in, keys(), values(), and items(), but not .get() or .update(). Some installed builds also support context-manager cleanup. Generated code should use context-manager cleanup when __enter__ is available, and otherwise consume the mapping-like result directly while copying required frame data before the next step.
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 the stage while a step operation is in flight.
Stage Composition APIs
ovrtx 0.3 uses explicit stage composition:
renderer.open_usd(path)replaces the active root layer with a file/URL.renderer.open_usd_from_string(usda)replaces the active root layer with generated inline USDA, commonly a wrapper root withsubLayersand viewer-owned camera/render prims.renderer.add_usd_reference(path, prefix_path="/Runtime/Asset")adds referenced content under an existing root stage and returns a handle.renderer.add_usd_reference_from_string(usda, prefix_path="/Runtime/Asset")is the inline-string additive-reference path.renderer.remove_usd(handle)removes additive content by handle.renderer.reset_stage()clears the stage to empty. It is not needed for normal root replacement becauseopen_usd*replaces the root.
Do not use older implicit stage-addition APIs as the main load path in 0.3 docs or examples.
Frame Extraction
products = renderer.step(render_products={RENDER_PRODUCT_PATH}, delta_time=dt)
with products as ctx:
if RENDER_PRODUCT_PATH in ctx:
product = ctx[RENDER_PRODUCT_PATH]
for frame in product.frames:
if "LdrColor" in frame.render_vars:
with frame.render_vars["LdrColor"].map(device=Device.CUDA) as rv:
rgba_cuda = wp.from_dlpack(rv) # H x W x 4, channel-last
with frame.render_vars["LdrColor"].map(device=Device.CPU) as rv:
pixels = np.from_dlpack(rv).copy() # H x W x 4 RGBACUDA mapping exposes linear CUDA memory. CPU mapping transfers data to host. For local UI, copy inside the map context before returning.
A 0.3 render variable output can contain one or more named tensors plus named params. For single-tensor outputs such as LdrColor, use the mapped object itself as the DLPack producer (np.from_dlpack(rv) / wp.from_dlpack(rv)). For multi-tensor outputs, address tensors by name (rv["Coordinates"], rv["Intensity"]) and params through rv.params["hitCount"]. Do not write new code against older single-tensor convenience access.
C maps an ovrtx_render_var_output_t with ovrtx_map_render_var_output(). Iterate its tensors[] and params[] by name; do not assume tensor index 0 is the only payload unless the RenderVar contract says it is.
Frame Result Lifetime
RenderProductSetOutputs, products, frames, mapped render var outputs, and tensor wrappers are per-step views into ovrtx-owned output. Map and copy render vars while the owning RenderProductSetOutputs object is still alive, inside the same render-loop step that produced them. When the step result supports __enter__, use with products as ctx: for deterministic cleanup; when it does not, still copy the data before the next renderer.step().
Do not return a frame, render var output, mapped tensor, DLPack wrapper, or NumPy/Warp view that still depends on the mapped ovrtx output. Do not hold references to frame data across later renderer.step() calls; the next step can invalidate handles from the previous step.
If frame data must move downstream to an encoder, streaming layer, UI bridge, worker queue, or logger, copy it before the step result goes out of scope. For CPU paths, use an owned array such as np.from_dlpack(rv).copy(). For CUDA paths, copy into an application-owned persistent CUDA buffer, such as a Warp array allocated outside the map context, before passing that buffer to the next stage.
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={...}).
Browser-streamed Omniverse Realtime Viewer apps should keep this resolution fixed, typically 1920x1080, and let the browser display the video with object-fit: contain. ovrtx does not expose a renderer.resize() API, and ovstream encoders should not be treated as live-resizable.
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>,
</Render/Vars/HdrColor>,
</Render/Vars/Depth>,
</Render/Vars/Normal>,
</Render/Vars/InstanceSeg>,
</Render/Vars/SemanticSeg>,
</Render/Vars/Metallic>,
</Render/Vars/Roughness>,
</Render/Vars/Emissive>,
</Render/Vars/Diffuse>,
</Render/Vars/Specular>,
</Render/Vars/AO>,
</Render/Vars/DirectDiffuse>,
</Render/Vars/DirectSpecular>,
</Render/Vars/IndirectDiffuse>,
</Render/Vars/IndirectSpecular>,
</Render/Vars/MotionVectors>,
]
}
def RenderVar "Normal"
{
uniform string sourceName = "NormalSD"
}frame.render_vars is keyed by source name, not necessarily by RenderVar prim name. For example, the RenderVar "Normal" prim appears as NormalSD in Python.
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 | uint32 [H,W,4] | Screen-space normals exposed as packed float bit patterns |
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]. The composite stage can request more render vars for future use, but do not expose them until they map to real non-empty data.
AOV Discovery
Discover available display AOVs from real frame output, then filter through a conservative allowlist.
DISPLAY_AOVS = (
"LdrColor",
"HdrColor",
"NormalSD",
"InstanceSegmentationSD",
"SemanticSegmentationSD",
)
def _update_available_aovs(self, render_vars: Any, notify: bool = False) -> None:
names = set(render_vars.keys()) if hasattr(render_vars, "keys") else set(render_vars)
available = {name for name in DISPLAY_AOVS if name in names}
if not available:
available = {"LdrColor"}
self._available_aovs = availableLog the full render_vars key list once when investigating new ovrtx versions, but use the allowlist for UI state. Presence in render_vars does not guarantee that mapping succeeds or that the tensor is non-empty.
AOV Conversion
ovstream expects one BGRA8 CUDA image. Convert every selected AOV into a persistent wp.uint8 [H,W,4] buffer:
with fout.render_vars[aov_name].map(device=Device.CUDA) as rv:
# Single-tensor output. For multi-tensor outputs, use rv["TensorName"].
src = wp.from_dlpack(rv)
shape = tuple(int(dim) for dim in src.shape)
height, width = shape[0], shape[1]
channels = shape[2] if len(shape) >= 3 else 1
dtype = src.dtype
dim = (width, height)
if dtype == wp.uint8 and len(shape) == 3 and channels == 4:
wp.copy(self._stream_buf, src)
wp.launch(_swap_rb, dim=dim, inputs=[self._stream_buf], device="cuda:0")
return True
if dtype == wp.uint32 and len(shape) == 3 and channels == 1:
wp.launch(_colorize_seg_3d, dim=dim, inputs=[src, self._stream_buf], device="cuda:0")
return TrueInclude kernels for uint8, uint16, uint32, float32, and float16,
with channel-last scalar, RGB, and RGBA forms. See aov-switching for the full
dispatch rules.
Live Attribute Writes
ovrtx consumes Fabric attributes such as omni:xform; standard authored USD xformOp:* is not the live update path.
xforms = np.array([...], dtype=np.float64).reshape(n, 4, 4)
renderer.write_attribute(
prim_paths=paths,
attribute_name="omni:xform",
tensor=xforms,
semantic=Semantic.XFORM_MAT4x4,
prim_mode=PrimMode.CREATE_NEW,
data_access=0, # 0=ASYNC for GPU tensors, 1=SYNC for CPU numpy
)PrimMode.EXISTING_ONLY silently skips attributes not already registered. Use CREATE_NEW for camera, animation, and EffectLayer attributes that may not exist in Fabric yet.
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, which is useful for long-running viewers that replace stages repeatedly. Choose the value once at renderer creation.
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
ovrtx runtime population is schema-driven. Built-in stage data such as Cameras, RenderProducts, RenderVars, omni:xform, pickability, and selection-outline attributes use ovrtx-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. Resolve them through the renderer path dictionary (ovrtx_get_path_dictionary() and path-dictionary utilities). Python high-level stage queries return path strings, while Python pick-hit decoding uses Renderer.resolve_prim_path_id().
Geometry Streaming
For USD assets, prefer open_usd* and 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:
Streaming/direct ovrtx server: set
OVRTX_SKIP_USD_CHECK, constructRenderer, then importpxrif direct queries are needed.Lightweight local Omniverse Realtime Viewer and OvGear 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
import numpy as np
from PIL import Image
os.environ["OVRTX_SKIP_USD_CHECK"] = "1"
from ovrtx import Renderer, RendererConfig, Device
renderer = Renderer(config=RendererConfig(sync_mode=True))
renderer.open_usd("/path/to/composite.usda")
for _ in range(60):
products = renderer.step(render_products={"/Render/RenderProduct"}, delta_time=1/60)
with products as ctx:
product = ctx["/Render/RenderProduct"]
for frame in product.frames:
if "LdrColor" in frame.render_vars:
with frame.render_vars["LdrColor"].map(device=Device.CPU) as rv:
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 renderer.step() output as a dict | use with products as ctx: and ctx[path] |
AttributeError: __enter__ from with products as ctx: | installed step result is mapping-like but not a context manager | branch on hasattr(products, "__enter__"), consume directly when absent, and copy frame data before the next step |
| invalid output handle after returning frame data | frame or render var view outlived its RenderProductSetOutputs | copy inside the same step before the context exits |
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 | missing Fabric attr with default mode | use PrimMode.CREATE_NEW |
| transform not visible | wrote xformOp:transform | write omni:xform with semantic |
Semantic.XFORM_MAT4x4 becomes NONE | imported adapter implementation module _ovrtx | import ovrtx directly |
| single-tensor examples fail or hide data | 0.3 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 source name |
Depth mapping fails | wrong source name | use DepthSD not Depth |
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.
Requirements and compatibility
Written for: OpenAI Codex
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.
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
- OpenAI (Official)
- Distributed by
- OpenAI
- Source
- openai/plugins · plugins/nvidia/skills/omniverse-realtime-viewer · commit d420d13
- Licence
- Apache License 2.0 (redistribution allowed)
- LICENSE (written by AutoGineer)
- ATTRIBUTION.md (written by AutoGineer)
- Synced
AutoGineer is not affiliated with or endorsed by NVIDIA Omniverse or OpenAI.
Download ZIP
The ZIP holds the skill’s files, its licence files and an ATTRIBUTION.md. Download omniverse-realtime-viewer.zip