Output Routing
shadecore always renders into an offscreen framebuffer (FBO). That framebuffer texture is:
- drawn to the local preview window (always on)
- optionally published or streamed via the selected output mode
The active output mode is controlled by assets/output.json (or an alternate output configuration file).
Runtime Hotkeys (Default)
1 — Texture Only (Preview)
What it does
- Disables all external routing.
- Only the local preview window is active.
When to use it
- Debugging shaders and uniforms
- Verifying render correctness
- Performance testing
- Running without Syphon / Spout / FFmpeg / NDI dependencies
Expected behavior
- Lowest overhead
- Most deterministic execution
- No external consumers receive frames
2 — Syphon (macOS)
What it does
- Publishes the rendered OpenGL texture to a Syphon server.
When to use it
- Routing video into OBS (Syphon input)
- macOS-based visual tools such as Resolume, MadMapper, TouchDesigner, or VDMX
- Local, zero-copy GPU workflows
Expected behavior
- Very low latency
- GPU texture sharing (no encode, no network)
- macOS only
Notes
- Syphon server name is configurable in the output config.
- Local preview remains active.
3 — Spout2 (Windows)
What it does
- Publishes the rendered texture as a Spout2 sender.
When to use it
- OBS on Windows (Spout2 plugin)
- TouchDesigner, Resolume, or other Windows-based visual tools
- Local low-latency routing without encoding
Expected behavior
- Very low latency
- GPU texture sharing
- Windows only
Notes
- Sender name is configurable.
- Preview remains active.
4 — Stream (FFmpeg RTSP / RTMP)
What it does
- Spawns an FFmpeg process.
- Frames are encoded and streamed to a network endpoint.
When to use it
- Sending video to another machine
- Feeding RTSP/RTMP servers (e.g., mediamtx)
- Remote or headless workflows
- Software that expects a network stream
Expected behavior
- Higher CPU/GPU load due to encoding
- Higher latency than texture-sharing outputs
- Network-visible stream
Common configuration fields
stream.ffmpeg_pathstream.url- codec, bitrate, preset, framerate, resolution
Notes
- Many encoders (e.g. H.264) require even-numbered frame dimensions.
- Preview remains active.
6 — NDI (Dedicated Mode)
What it does
- Sends frames to an NDI sender discoverable on the local network.
Why NDI is separate
- Requires a different runtime lifecycle
- Different threading and timing constraints
- Kept out of the core render loop intentionally
When to use it
- OBS NDI input workflows
- LAN-based video routing with automatic discovery
- Multi-machine studio setups
Expected behavior
- Network-based video transport
- Higher overhead than Syphon/Spout
- Easier discovery than RTSP in many setups
Notes
- Typically run via a dedicated feature or binary.
- Uses its own output configuration (e.g.
output_ndi.json). - Preview behavior depends on NDI mode configuration.
Hotkey Configuration
Hotkeys are defined in the output configuration JSON. This allows:
- Rebinding keys without recompiling
- Platform-specific key maps
- Separate configs per output mode
This design keeps routing logic declarative and reproducible.