Limitations#
SPG is under active development. The API surface, Lua bindings and supported workflows can evolve across releases. This is what it does not do today.
GPU sources are limited to CUDA (
.cu, or precompiled.ptx,.cubin,.fatbin) and Slang (.slang, or precompiled.slang-moduleor.spv), each with its.lualaunch script and a.usdashader definition. They are loaded from the local filesystem, from a.usdzpackage, or from a URI the Omniverse client can fetch.A CUDA node is one translation unit, compiled against a single include directory, and the directory holding the
.cuis not it, so a header beside the source does not resolve. Slang has no such limit: a shader imports modules beside itself.SPG Shader nodes must not be nested under a
Materialprim, and shaders under an instance prototype are ignored.Standard library nodes operate on 2D textures only. Integer texture formats (
SINT,UINT) and buffer-backed resources are not supported by them.Slang shaders need the renderer to be running on Vulkan, and cannot use 64-bit integer types because the
shaderInt64feature is not enabled.A ray-generation node cannot use a
.spvbinary.No node is given geometry. There are no vertex or index buffers and no material data; a ray-generation node gets hit distance and surface identity from a trace and nothing more.
A launch script cannot read the scene. A prim’s attributes, a camera’s transform and how a render product is laid out are all unreachable from it; a node is given what its ports carry and its authored value-inputs, and nothing else.
A product bound to more than one camera is rendered in tiles, one camera per tile, and a node reading that image sees all of them at once with nothing to tell it the layout.
A node cannot reach the CPU mid-frame. No pixel data is readable from the launch script, and the GPU code cannot call back to the host.
A node cannot reach other frames, beyond what a stateful output or a previous-frame read carries.
A launch script cannot reach the filesystem or the OS; its sandbox has neither.
A shader output can be bound to one RenderVar at a time.
A node cannot read an AOV and publish under that same name within one RenderProduct.
A previous-frame read reaches at most 8 frames back.
Cross-product reads can be one frame stale when the consuming product renders before the producing one, and converge once the dependency has rendered.