1. Docs
  2. Shader Engine Docs
  3. Editing Shaders

Editing Shaders

Shader Engine includes a full shader editor, so you can tweak, fix, or build shaders without leaving Resolume. You don’t have to use it — but when a shader is almost right, it’s the fastest way to finish the job.

Open Browse Library, load or select a shader, and edit its code in place. Each tab (LOCAL, ISF, SHADERTOY) has its own editor for the shader you’re working on there.

The edit → preview loop

  1. Change the GLSL code.
  2. Shader Engine recompiles and the result updates in Resolume.
  3. If the code doesn’t compile, you get an error message telling you what’s wrong — and the composition keeps rendering the last good version.

Because compilation happens in the plugin’s own sandbox, invalid code never crashes Resolume. You can experiment freely; the worst case is an error message.

Errors and how they’re shown

  • Compile errors appear as notifications (toasts) in the browser window, and the Status parameter in Resolume reflects load failures too.
  • Line numbers in errors match your own code. Shader Engine arranges compilation so the line an error reports is the line in your file — not some offset into generated code. If the error says line 12, look at line 12.
  • Errors are written to be useful to a shader author — enough detail to find the problem — without dumping raw internals on someone who just wants effects. They’re shown as messages rather than inline markers, so read the message and jump to the line it names.

See Troubleshooting for how to read common compile errors.

Saving

  • Ctrl+S saves the shader you’re currently editing.
  • The editor marks a shader as unsaved (dirty) when you have changes you haven’t written to disk, and shows which file you’re editing, so you never lose track.
  • Shader Engine avoids destructive changes: it won’t overwrite your file behind your back.

If the file changed on disk

If a file you’re editing is modified outside the plugin (say you edited it in another program) while you have unsaved changes, Shader Engine detects the conflict and asks what to do:

  • Overwrite — keep your in-editor version and write over the disk copy.
  • Reload — discard your edits and load the newer version from disk.
  • Cancel — do nothing for now.

Editing files outside your library

If you open and save a shader that lives outside your library folder, Shader Engine offers to copy it into the library first, so your edits stay organized with everything else. See The Library Browser.

Exporting

When you’re happy with a shader — especially a translated Shadertoy import or a heavily edited one — export it as ISF to save a clean, portable .isf file you can reuse or share.

Keyboard shortcuts

Key Action
Ctrl+O Open a shader file and add it to your library
Ctrl+S Save the shader in the active editor
Escape Return to the library / close the window

A note for shader authors

The editor is a genuine ISF workflow: write ISF metadata to declare inputs, and those inputs become live Resolume controls the moment the shader compiles. That makes Shader Engine a fast iteration environment — edit, see it in Resolume, map a control, repeat. For the input syntax, the ISF spec is the reference; Shader Engine follows it.

A few author-facing capabilities worth knowing:

  • Custom vertex shaders. Put a .vs file next to your fragment shader with the same name (warp.fs + warp.vs) and it’s compiled as the ISF vertex stage. Both ISF v2 (isf_) and legacy v1 (vv_) naming are accepted.
  • #include. Shaders can include shared GLSL files — relative to the shader’s folder or from the root of your library (drop a lygia/ folder or a helpers file there and include it from any shader). Nested includes resolve too.
  • Event inputs. TYPE: "event" inputs become momentary triggers — true only on the frame they fire — for one-shot resets, flashes, and bangs.
  • Expression pass sizes. Multi-pass WIDTH/HEIGHT accept expressions like "$WIDTH/2" (with min, max, floor, clamp, and friends), so buffers can scale with the output resolution.
  • Sensible defaults. A float input without a DEFAULT starts at the midpoint of its range, and out-of-range defaults are clamped — matching the reference ISF implementation.

Next