Native Stereo Image Viewer (PyOpenXR)
Look at a Stereo Image in the Headset, Straight From the Graph
- image
- passthrough
The image-only sibling of NativeStereoVideoViewer, and honestly the more convenient one. Wire a stereo image into it, run the workflow, and the pack's PyOpenXR viewer launches inside your headset showing that image - no browser, no file transfer to the Quest, no leaving ComfyUI. Where the video viewer is a terminal with no outputs, this one both shows the image and returns it, so you can keep a preview node sitting in the middle of a graph without breaking the data flow.
It's the fastest way to sanity-check stereo output. Did StereoImageNode produce usable depth or a headache-inducing mess? One run in the headset tells you immediately.
How it works
The node saves your image to a temp file (hash-named, so reruns don't litter), then hands it to the same native OpenXR viewer used across the pack. The viewer is persistent - run the workflow again with a new image and it swaps the content in place instead of opening another window. If PyOpenXR or a runtime isn't available, it prints a "NATIVE VR VIEWER NOT AVAILABLE" banner and returns your image unviewed, which is graceful but easy to miss if you're not watching the console.
The inputs that matter
- image - your stereo image, typically straight out of StereoImageNode's
stereoscopeoutput. - stereo_format -
Side-by-Side,Over-Under, orMono. Match how the image is laid out; a mismatch looks like a blurry double exposure. - projection_type -
Flat Screen,Curved Screen,180° Dome, or360° Sphere. Flat for regular stereo, dome/sphere for equirectangular. - screen_size and screen_distance (1.0–10.0) - the virtual screen's size and how far it floats.
- swap_eyes - flip left/right when the depth feels inverted.
- auto_launch (default on) - if you're iterating on a batch, you'll want this off; otherwise the viewer pops on every single run.
The only output is passthrough, the unchanged input image - useful for keeping the graph flowing, useless as a real result. There are no outputs beyond it.
Install
ComfyUI Manager → search "ComfyStereo", or:
cd ComfyUI/custom_nodes
git clone https://github.com/Dobidop/ComfyStereo.git
cd ComfyStereo
pip install -r requirements.txt
The requirements file includes pyopenxr, PyOpenGL, PyOpenGL_accelerate, and glfw. Beyond that you need an OpenXR runtime running - SteamVR, the Oculus runtime, or Windows Mixed Reality - with your headset connected.
Troubleshooting
- Node missing from the menu - the pack disables the native nodes at import if
pyopenxrisn't installed. Install requirements and restart. - Nothing appears in the headset - run NativeVRStatus to see whether the problem is a missing runtime vs a missing package; the two have different fixes.
- The viewer opens but the image looks doubled and wrong -
stereo_formatmismatch, or you needswap_eyes.
It's a simple node - a preview pass, really - but it's the difference between trusting your stereo conversion on faith and actually verifying it.
Inputs (8)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| stereo_format | COMBO | 3 options: Side-by-Side, Over-Under, Mono | |
| projection_type | COMBO | 4 options: Flat Screen, Curved Screen, 180° Dome, 360° Sphere | |
| screen_size | FLOAT | 3.01–10 | — |
| screen_distance | FLOAT | 3.01–10 | — |
| swap_eyes | BOOLEAN | false | — |
| auto_launch | BOOLEAN | true | — |
| background_color | COMBO | 4 options: Black, Dark Gray, Gray, White |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| passthrough | IMAGE | — |