Skip to main content

Overview

VRSL’s video streaming system bridges professional lighting control software with VRChat by encoding DMX data into video pixels. This enables real-time control of hundreds of fixtures from industry-standard tools like MA3, Chamsys, or QLC+.
The Grid Node is a separate paid application that runs locally, converting Art-Net/sACN to video that can be streamed to VRChat.

System Architecture

Grid Node Application

Installation & Setup

  1. Purchase the Grid Node from Gumroad
  2. Extract and run the application
  3. Configure network settings:
    • Art-Net Universe: 1-9 (or more with RGB mode)
    • sACN Universe: Same as Art-Net
    • OSC Port: 12000 (for Unity editor sync)
  4. Set orientation:
    • Vertical Mode: 13×67 grid (871 channels, 6.7 universes)
    • Horizontal Mode: 120×13 grid (1560 channels, 3 universes)
Vertical mode is recommended for most setups as it efficiently maps to DMX universes.

RGB Expanded Mode

Enable RGB mode to triple capacity:
  • Red Channel: Universes 1, 4, 7
  • Green Channel: Universes 2, 5, 8
  • Blue Channel: Universes 3, 6, 9
Total capacity: Up to 9 universes (4,608 channels)

Grid Node Output

The Grid Node outputs a 1920×1088 video texture: Vertical Mode:
  • Grid area: 208×1072 pixels (13×67 cells, 16px each)
  • Remaining space: Black/unused
Horizontal Mode:
  • Grid area: 1920×208 pixels (120×13 cells, 16px each)
  • Remaining space: Black/unused

Unity Editor Integration

During development, the Grid Node can sync directly with Unity:

GridReader Component

The GridReader.cs script receives OSC data from Grid Node:

OSC Message Parsing

Texture Buffer Update

Changed cells are written to the texture each frame:
The GridReader is editor-only (#if UNITY_EDITOR). In VRChat, the video player provides the texture directly.

VRChat Video Player Setup

In your VRChat world:

1. Add Video Player

Use USharp Video Player or similar:

2. Assign Render Texture

Create or assign the DMX grid render texture:
  • Name: _Udon_DMXGridRenderTexture (or legacy _OSCGridRenderTextureRAW)
  • Size: 1920×1088 or larger
  • Format: RGBA32
  • Filter Mode: Point (no interpolation)
  • Wrap Mode: Clamp

3. Global Shader Properties

Set the texture globally so all VRSL shaders can access it:
The texture MUST be set globally. Per-material assignment will not work due to GPU instancing.

Streaming Setup

OBS Configuration

  1. Add Window Capture or Display Capture source
  2. Point to VRSL Grid Node application
  3. Crop to grid area if desired
  4. Set output resolution:
    • 1920×1080 (standard)
    • Higher if you need sharper pixels
  5. Critical: Set bitrate high enough to prevent compression:
    • Minimum: 6000 kbps
    • Recommended: 8000-10000 kbps
    • Ideal: Lossless recording/local streaming

Streaming Platform

Options for delivering video to VRChat: Twitch
  • Pros: Low latency (2-4 seconds), reliable
  • Cons: Public stream, compression artifacts
  • Bitrate: Use maximum allowed for your partnership tier
YouTube Live
  • Pros: High quality, unlisted streams
  • Cons: Higher latency (5-10 seconds)
  • Bitrate: Up to 51 Mbps for 4K
Self-Hosted RTMP
  • Pros: Full control, minimal compression
  • Cons: Requires server, networking knowledge
  • Bitrate: Unlimited
For best quality, use a self-hosted RTMP server or record locally and use a file-based video player for testing.

Compression Handling

Video compression is the biggest challenge for DMX streaming:

Problems Caused by Compression

  1. Color Banding - DMX values become imprecise
  2. Temporal Artifacts - Fast changes get blurred
  3. Block Artifacts - Encoding blocks create false data

VRSL’s Mitigation Strategies

Interpolation Render Texture Smooths values over time:
Movement-Specific Texture Pan/tilt data uses separate, more heavily smoothed texture:
Strobe Timing Generation Converts unreliable strobe values to stable phase:

Latency Optimization

End-to-End Latency Breakdown

Reducing Latency

  1. Use Twitch - Lowest platform latency
  2. Enable Low Latency Mode - In Twitch settings
  3. Reduce Buffer - In USharp Video Player settings
  4. Optimize Encoding - Use hardware encoding (NVENC/QuickSync)
  5. Local Network - Test with local RTMP server first
Some latency is unavoidable. Design your lighting cues with a 1-2 second offset to sync with audio.

Texture Modes

VRSL supports multiple texture configurations:

Legacy Textures

Modern Textures

Modern textures separate movement and strobe data for better quality and performance.

Testing Without Grid Node

For testing without streaming:

1. Use Pre-recorded Video

Record a Grid Node session and play back:

2. Use GridReader in Editor

Enable the GridReader component with OSC:

3. Manual Texture Updates

Write a custom script to simulate DMX:

Advanced Features

OSC Commands

Grid Node supports OSC control:

MIDI Output

Grid Node can output MIDI alongside video:
  • Convert DMX channels to MIDI CC
  • Useful for triggering other software
  • Planned for future VRChat OSC integration

Multiple Outputs

Run multiple Grid Node instances:
  • Different universe ranges
  • Different orientations
  • Multiple worlds simultaneously

Troubleshooting

Grid Appears Black

  • Check video player is playing
  • Verify render texture is assigned
  • Ensure texture is set globally (not per-material)
  • Check _EnableVerticalMode matches Grid Node

Fixtures Not Responding

  • Verify DMX channel assignments
  • Check universe configuration in Grid Node
  • Ensure fixtures have _EnableDMX enabled
  • Test with GridReader in editor first

Jittery Movement

  • Increase streaming bitrate
  • Use movement-specific smoothing texture
  • Adjust _ConeSync parameter
  • Consider slower, smoother movements

Incorrect Colors

  • Check RGB mode enabled in both Grid Node and fixtures
  • Verify _NineUniverseMode setting
  • Ensure color channels are mapped correctly
  • Test with solid colors first

DMX System

How DMX data is encoded and decoded

Shader Architecture

How shaders read the video texture