You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
<palign="center"><em>A native, high‑performance GLSL rendering engine written in Rust, designed for real‑time shader experimentation, MIDI control, and live video routing.</em></p>
5
+
<palign="center"><em>A native, high-performance GLSL rendering engine written in Rust, designed for real-time shader experimentation, hardware control, and live video routing.</em></p>
6
6
7
7
---
8
8
9
9
## Description
10
10
11
-
`shadecore` is a **standalone OpenGL shader engine** that renders a fullscreen GLSL fragment shader and can route the output as:
11
+
`shadecore` is a **standalone OpenGL shader engine** that renders a fullscreen GLSL fragment shader and routes the result to multiple real-time video outputs.
12
12
13
-
- local window preview (FBO texture)
13
+
Supported outputs:
14
+
15
+
- Local window preview (always on)
14
16
-**Syphon** (macOS)
15
17
-**Spout2** (Windows)
16
-
-**Stream** via FFmpeg (RTSP for local network; RTMP for platforms)
18
+
-**FFmpeg streaming** (RTSP / RTMP)
19
+
-**NDI** (separate execution mode)
20
+
21
+
The engine is intentionally **low-level and explicit**:
17
22
18
-
It is designed to be:
19
-
- fast enough for feedback systems,
20
-
- deterministic enough for installations,
21
-
- flexible enough to act as a base for many future tools.
23
+
- No GUI framework
24
+
- No WebView
25
+
- No runtime abstraction layer between your shader and the GPU
22
26
23
-
There is **no GUI framework**, **no WebView**, and **no runtime abstraction layer** between your shader and the GPU.
27
+
What you write in GLSL is what runs.
24
28
25
29
---
26
30
27
31
## Purpose
28
32
29
-
This project exists to solve a common problem in creativecoding:
33
+
This project exists to solve a common creative-coding problem:
30
34
31
35
> *“I want to build my own visual tools without shipping an entire framework.”*
32
36
33
-
`shadecore` is intended to be:
34
-
- a **foundation** for custom shader‑based applications,
37
+
`shadecore` is designed to be:
38
+
39
+
- a **foundation** for custom shader-based tools,
35
40
- a **bridge** between GLSL and external control systems,
36
-
- a **standalone binary** rather than a patch inside another tool.
41
+
- a **standalone binary**, not a plugin locked into another host.
42
+
43
+
It is equally suited for:
44
+
- live performance,
45
+
- installations,
46
+
- research tools,
47
+
- experimental pipelines.
37
48
38
49
---
39
50
40
51
## Features
41
52
42
53
- Native OpenGL rendering (via `glow`)
43
54
- Fullscreen GLSL fragment shader pipeline
44
-
- MIDI parameter control (CoreMIDI)
45
-
- JSON‑defined parameter schema
46
-
- Syphon server output (macOS)
47
-
- Spout2 sender output (Windows)
48
-
- FFmpeg streaming output (RTSP/RTMP)
49
-
- Vendored framework dependencies (no system installs for Syphon/Spout)
55
+
- JSON-defined parameter schema
56
+
- MIDI control (CoreMIDI on macOS, cross-platform via `midir`)
57
+
-**Syphon server output** (macOS)
58
+
-**Spout2 sender output** (Windows)
59
+
-**FFmpeg streaming output** (RTSP / RTMP)
60
+
-**NDI output (separate run mode)**
61
+
- Vendored native dependencies (no system installs required)
50
62
- Deterministic build & runtime behavior
51
63
52
64
---
53
65
54
66
## Running the Project
55
67
56
68
### Requirements
57
-
- macOS or Windows (Linux builds for local preview are possible)
58
-
- Rust (stable)
59
69
60
-
Platform extras:
61
-
- macOS: Xcode Command Line Tools (Syphon.framework is vendored)
62
-
- Windows: Visual Studio Build Tools (Spout2 is vendored)
63
-
- Streaming: FFmpeg available in PATH, or set `stream.ffmpeg_path` in `assets/output*.json`
70
+
- macOS or Windows
71
+
- Rust (stable toolchain)
72
+
73
+
Platform-specific:
74
+
75
+
-**macOS**
76
+
- Xcode Command Line Tools
77
+
- Syphon.framework is vendored (no install required)
78
+
-**Windows**
79
+
- Visual Studio Build Tools (C++ workload)
80
+
- Spout2 is vendored
81
+
-**Streaming**
82
+
- FFmpeg available in `PATH`
83
+
- or set `stream.ffmpeg_path` in `assets/output*.json`
64
84
65
-
### Build & Run
85
+
---
86
+
87
+
## Build & Run (Standard Engine)
66
88
67
89
```bash
68
90
cargo run
69
91
```
70
92
71
93
This will:
94
+
72
95
- compile the engine
73
-
- launch the renderer
74
-
- load defaults from `assets/params.json` and `assets/output.json`
75
-
- show a local preview window (always)
76
-
77
-
Switch outputs at runtime (defaults, configurable in `assets/output*.json`):
78
-
-`1` = Texture (preview only)
79
-
-`2` = Syphon (macOS)
80
-
-`3` = Spout2 (Windows)
81
-
-`4` = Stream (FFmpeg RTSP/RTMP)
96
+
- launch the OpenGL renderer
97
+
- load:
98
+
-`assets/params.json`
99
+
-`assets/output.json`
100
+
- open a local preview window (**always active**)
101
+
82
102
---
83
103
84
-
## Project Structure
104
+
## Output Routing
105
+
106
+
Output behavior is controlled by `assets/output.json` (or alternate output configs).
107
+
108
+
### Runtime Hotkeys (default)
109
+
110
+
-`1` — Texture only (preview)
111
+
-`2` — Syphon (macOS)
112
+
-`3` — Spout2 (Windows)
113
+
-`4` — Stream (FFmpeg RTSP / RTMP)
114
+
-`6` — NDI (see below)
115
+
116
+
Hotkeys are configurable in the output JSON.
117
+
118
+
---
119
+
120
+
## ⚠️ NDI Output (Important)
121
+
122
+
NDI is **not enabled in the default execution path**.
123
+
124
+
This is intentional.
125
+
126
+
### Why NDI Is Separate
127
+
128
+
NDI requires:
129
+
- a different runtime lifecycle,
130
+
- different threading assumptions,
131
+
- tighter timing guarantees.
132
+
133
+
Rather than complicate the core render loop, NDI runs in a **dedicated execution mode**.
134
+
135
+
### Running with NDI
85
136
137
+
```bash
138
+
cargo run --features ndi
139
+
```
140
+
141
+
or
142
+
143
+
```bash
144
+
cargo run --bin shadecore-ndi
86
145
```
146
+
147
+
Check `Cargo.toml` for the active NDI configuration.
148
+
149
+
### NDI Notes
150
+
151
+
- NDI output is discoverable by OBS, Resolume, and other NDI-capable software
152
+
- Local preview still runs unless explicitly disabled
153
+
- NDI uses its own output configuration file
154
+
155
+
This separation is **by design**, not a limitation.
0 commit comments