Desktop application
Video

ShaderWeave

A desktop shader designer focused on both convenience and breadth: work with GLSL, CUDA and OptiX in the same network while inspecting intermediate results together. Compose and connect render passes intuitively, and attach live previews to make debugging easier.

Explore connections Brochure · 14 chapters ↓
Programs → textures → feedback
PassTextureState
Existing ShaderWeave capture: editable pass nodes, an explicit feedback link and visible intermediate outputs.
Existing ShaderWeave capture: editable pass nodes, an explicit feedback link and visible intermediate outputs.
An implemented pipeline

Make the intermediate image part of the interface

A final frame hides the network that produced it. ShaderWeave exposes that network as an editable, continuously visible object.

  1. 01

    Write a pass

    GLSL programs and Shadertoy-style channels provide the starting vocabulary.

  2. 02

    Connect textures

    A node's output becomes an input to another stage.

  3. 03

    Retain state

    Persistent buffers and feedback links make time part of the topology.

  4. 04

    Inspect & iterate

    Intermediate previews connect a local code change to the final behavior.

Representation

The graph is the program

Explicit channels and feedback describe multipass behavior that a single final-image shader editor conceals.

Inspection

Every buffer can tell a story

Node previews expose the state of accumulations, transformations and simulation loops as they run.

Interop

Different producers, shared textures

CUDA and OptiX paths can supply framebuffer textures to shader experiments without claiming one universal execution model.

Composition

Programs and observations meet

Raster-stage sockets, code snippets, capture textures and audio level histories extend the graph. Audio visualization uses envelopes, rather than a frequency transform.

Capabilities / connected systems

Read the system by what it makes possible

Related techniques belong to one family. Follow a family into the interface, recorded results and mathematical detail.

01 / 04

Passes, resources & composition

Build GPU programs from connected passes, with each pass’s code, inputs and output visible.

Shader entry pointsTyped resource socketsReusable source snippetsProducer substitution
Feature set · 4 capabilities
  • Shader entry pointsShaderToy-style wrappers provide familiar uniforms and channels while raw and injected source remain visible.
  • Typed resource socketsShader declarations distinguish image dimensions, access and roles so resource connections carry more meaning than an untyped wire.
  • Reusable source snippetsSnippet nodes contribute GLSL functions to compilation separately from connections carrying rendered images.
  • Producer substitutionReplace a compatible source while preserving its downstream experiment, including dynamic environment inputs.
02 / 04

Raster stages, compute & ray programs

Compose different GPU programming models while retaining their compilation and launch boundaries.

Vertex and geometry stagesDepth as an intermediateCUDA compilationOptiX programs
Feature set · 4 capabilities
  • Vertex and geometry stagesStage sockets assemble linked raster programs, allowing source edits to change vertex motion and primitive generation.
  • Depth as an intermediatePasses using the supported depth-output convention expose depth textures for separate downstream inspection.
  • CUDA compilationNVRTC-compiled CUDA nodes supply GPU image results for later graph stages through registered resources.
  • OptiX programsProgrammable ray traversal and custom outputs connect to GLSL consumers on supported NVIDIA hardware.
03 / 04

Feedback, accumulation & time volumes

Make previous state and cross-pass dependencies explicit in evolving visual systems.

Ping-pong stateAccumulation historiesRolling time volumeDiffusion Fusion
Feature set · 4 capabilities
  • Ping-pong stateSeparate read and write images represent successive simulation states; feedback denotes a temporal dependency.
  • Accumulation historiesPersistent buffers retain contributions across frames, with resets defining when an experiment changes.
  • Rolling time volumeStore successive source frames in depth slices and unwrap the cyclic storage into a chronological view.
  • Diffusion FusionThree authored stateful passes exchange transport, luminous structure and sharpening, with each intermediate available to inspect.
04 / 04

Live inputs, assets & execution

Keep source data, intermediate activity and the final view visible within one workspace.

Images, environments and geometryInterface and desktop captureAudio amplitude historyRender-plan inspectionNetwork snapshots
Feature set · 5 capabilities
  • Images, environments and geometryLoad supported assets and inspect orientation, format and dynamic range before using them downstream.
  • Interface and desktop captureEditor framebuffers and supported screen/window capture paths become image producers in the graph.
  • Audio amplitude historyLoopback and audio-file inputs provide measured level envelopes and history for visual control.
  • Render-plan inspectionConnected components, projected outputs and graph revisions drive a cached render plan and visible activity overlays.
  • Network snapshotsExport network state and associated source as the basis for a reproducible graph experiment.
Technical brochure · 14 chapters

Inside ShaderWeave

ShaderWeave is a desktop workspace for building shader systems. Source code, texture connections, persistent state and intermediate images stay visible together. Follow an edit through a multipass effect, a simulation loop or a CUDA/OptiX program, then inspect the stages that produced the final image.

Description · what it doesExplanation · how it worksTheory · equations & assumptions

Scan the descriptions and figures, or open a layer for the implementation and mathematical detail.

Capability family

Passes, resources & composition

Build GPU programs from connected passes, with each pass’s code, inputs and output visible.

01 · Purpose

The network is the program

A final image hides the program that produced it. ShaderWeave puts source editors, resource connections and live previews in one workspace. Each pass can be edited and inspected on its own, then connected to a larger system.

A fragment shader can remain a compact sketch. A larger experiment can combine persistent simulations, intermediate images and heterogeneous GPU work without hiding their dependencies inside one long program.

The desktop engine uses OpenGL/GLSL, including compute passes and persistent resources, with separate CUDA and OptiX integrations. Related browser experiments in WebGPU Atelier and RIVX explore similar graph ideas through their own implementations.

The workbench is my project; several shader artworks running inside it come from other creators. Those examples demonstrate importing, connecting and modifying GPU programs. Their original visual designs are credited separately below.

  • Edit a pass: source and injected program remain available beside the output.
  • Connect an image: a producer becomes an input to another stage.
  • Retain state: old and new resources make frame history explicit.
  • Inspect the consequence: compare intermediate previews before judging the final composite.
Source-derived schematic of image flow, code composition and retained state. The recordings below show the actual desktop interface.
Diagram Source-derived schematic of image flow, code composition and retained state. The recordings below show the actual desktop interface.
Video Original desktop recording: several networks and their intermediate visual results.
Video A larger shader network. Each visible pass has an input/output role that can be inspected independently.
02 · Import and adaptation

A familiar shader entry point

ShaderToy-style programs enter through the source library or pasted code. The wrapper supplies the expected entry point and familiar inputs such as time, resolution, mouse state and channels.

Raw and injected source views show both the authored program and the declarations presented to the driver. Expected buffers, samplers and feedback history still need matching graph resources; universal ShaderToy compatibility has not been established.

Video Loading and adapting ShaderToy-style programs in the desktop workbench.
Visible itemWhat it explains
Raw sourceThe pass as written or imported
Injected sourceGenerated declarations and wrapper used for compilation
Channel connectionsWhich image or retained buffer each sampler reads
Compile feedbackWhether the concrete assembled program compiled
Original shader source before the application supplies its wrapper.
Image Original shader source before the application supplies its wrapper.
Injected source exposes the wrapper and resource declarations used for compilation.
Image Injected source exposes the wrapper and resource declarations used for compilation.
03 · Node construction

Resources become visible sockets

The editor derives resource sockets from shader declarations and recognized conventions. Read-only and write-only image access, texture dimensions and resource roles remain visible instead of collapsing every connection into an untyped wire.

Image Generated sockets expose shader inputs and outputs as graph connections.

Source composition is different from image flow

Snippet nodes supply reusable GLSL code rather than a rendered texture. The receiving shader gathers connected snippets before compilation. This makes shared functions editable in the graph while keeping the code-generation step inspectable.

Resource size is an explicit decision

The editor includes fixed-resolution 2D texture nodes alongside mutable volumes. A smaller working image can feed a larger display without implying that the underlying simulation ran at display resolution. The receiving pass still needs compatible formats, access modes and synchronization.

ConnectionMeaningVisible consequence
Texture / cube / volumeRuntime image data with a dimension and bindingThe receiving pass previews transformed data
SnippetGLSL source inserted before the user programConnecting or removing shared code recompiles the target
Fixed-size texture resourceA persistent 2D allocation independent of the windowWriting through it resamples to the chosen resource size
FeedbackA previous-state dependencySeparate read/write storage preserves the old state
04 · Hot swapping

Change one producer, preserve the experiment

Hot swapping replaces the producer of an input while retaining the downstream processing chain. An image, generated texture or rendered view can feed the same effect when its interface is compatible. This is useful for testing what belongs to the algorithm and what belongs to its source data.

The dynamic skybox example extends the idea to a surrounding environment. The environment is a resource supplied by the graph, so changing its producer can alter the scene without rebuilding the whole composition. The practical boundary is compatibility: dimensions, formats and update behavior still need to match the consumer.

Video Replacing a graph input while retaining the processing chain.
Video A second routing example with live downstream feedback. Featured artwork: Snail by Inigo Quilez (iq); the recording demonstrates changing its connected inputs in ShaderWeave.
Video A dynamically supplied skybox connects environment construction to the graph.
Capability family

Raster stages, compute & ray programs

Compose different GPU programming models while retaining their compilation and launch boundaries.

05 · Vertex, geometry and fragment work

Connect the raster program as well as its images

The editor exposes vertex and geometry programs through a dedicated source menu. Stage sockets can supply a vertex program directly to a fragment pass, or carry it through a geometry stage. The receiving node assembles the linked raster program rather than mistaking those connections for sampled images.

This opens a different experiment from a post-processing chain: a source edit can change how vertices move or how primitives are emitted before the fragment program colors the result. The source tree includes wave/twist vertex examples and wire-sphere or spring-like geometry examples. These examples are present in the source collection; the recordings below cover the image-processing workflows.

Depth becomes another intermediate

When the source detects gl_FragDepth usage, the node provisions depth textures and exposes a depth output. A downstream view can then inspect depth independently of color. The detector is an implementation convenience, not a full semantic GLSL analysis, and connected-resource lifetime still matters when the source changes.

SocketCarriesRole
VSVertex-stage sourceTransform incoming vertices
GSGeometry-stage sourceChange emitted primitive geometry
SNPShared GLSL definitionsCompose reusable source before compilation
DSampleable depth outputInspect or consume depth written by the shader
06 · Heterogeneous execution

The graph crosses GPU programming models

CUDA nodes compile through NVRTC and supply image results through registered GPU resources. OptiX nodes provide programmable ray traversal and custom output. Both can become sources for downstream GLSL work, while retaining separate compilation, launch and synchronization requirements.

The phase-oriented OptiX recording belongs to custom ray programs and their accumulation model. OptiX itself is not a wave-equation solver. CUDA and OptiX require the corresponding NVIDIA runtime and hardware.

Image A CUDA program participates in the same visible resource network.
ProducerExecution modelInterface to the graph
Raster / compute GLSLDraw or compute dispatchBound textures and images
CUDANVRTC-compiled kernel launchRegistered output texture/resources
OptiXRay programs and acceleration traversalCustom output presented as a texture
Image OptiX-backed custom ray work. Phase behavior belongs to the user program and its accumulation model.
Capability family

Feedback, accumulation & time volumes

Make previous state and cross-pass dependencies explicit in evolving visual systems.

07 · Feedback and compute

State has a previous frame

A persistent simulation must distinguish the state being read from the state being written. Ping-pong resources supply that distinction: one image contains the previous state, another receives the next state, and their roles swap after the update. A feedback edge therefore means a temporal dependency, not an instruction to recursively evaluate a cycle in the same frame.

The SmoothLife and compute examples make the dependency visible. The recording with ping-pong buffering disabled is deliberately a failure demonstration: simultaneous reads and writes create a conflict, and the resulting appearance is not a valid alternative simulation. Accumulation buffers use the same resource idea for a different purpose, retaining previous contributions instead of evolving a local field. Resetting their history is part of changing the experiment.

Video SmoothLife-style feedback with persistent state.
state[t + 1] = F(state[t], inputs[t])
The graph must retain the old state until every reader that needs it has finished. The update equation alone does not guarantee stable numerical dynamics.
Video Intentional buffer-conflict demonstration with ping-pong protection disabled.
Video A compute pass using separate previous and next resources.
Video Accumulation is another use of explicit frame history.
08 · Worked network

A volume can hold the recent past

A rolling volume writes each source frame into another depth slice. The storage wraps; the viewer unwraps it into chronological order. A moving image becomes an inspectable time stack.

The documented example can record a shader, image, editor, screen or simulation. Volume depth sets the retained number of frames, while display rate determines how those frames relate to elapsed time. The small mutable volume is a practical starting resource.

Video A compute-written volume stores a rolling sequence of two-dimensional frames.
Producer → receiverRole
volume_ring_source → compute_frame_to_volume_ring.inputTexCurrent source frame
Volume_Empty_IO_Small.Vol → compute.ringVolumePersistent writable 3D storage
compute.volumeOut → volume.iVChannel0Return the written resource to the volume node
volume.Vol → volume_ring_view.iVChannel0Unwrap the ring for viewing
09 · Diffusion Fusion example

Several feedback processes can cooperate

Diffusion Fusion separates transport, broad luminous structure and local sharpening into three interacting stateful passes. Each pass retains its own previous state; additional connections exchange outputs and the animated source.

The final composition can hide a clipped channel or runaway state. Projecting A, B and C individually locates the pass that introduced the behavior. This is a visual feedback experiment rather than a calibrated reaction–diffusion model.

  • Enable PP on A, B and C and connect each previous state to its own first channel.
  • The supplied README lists every channel connection and the source-injection weights.
  • Feedback settings can become unstable; inspect each pass when changing the connections or weights.
PassReads beyond its own previous statePurpose
A_DiffuseSource + C_ReactionCarry and diffuse the injected signal
B_FuseA_Diffuse + SourceCombine and swirl the broader field
C_ReactionB_Fuse + SourceSharpen and feed detail back
FinalA + B + C + SourceCompose the visible result
Capability family

Live inputs, assets & execution

Keep source data, intermediate activity and the final view visible within one workspace.

10 · Interaction

Images, models and views remain part of the workflow

Images, HDR environments and supported geometry or volume resources can be loaded, connected and inspected in the workspace. Drag-and-drop reduces the cost of replacing an input without rebuilding its consumers.

Viewers expose orientation, dynamic range and empty or unexpected output. Asset compatibility remains specific: HDR data needs meaningful exposure, volumes need a viewing convention, and a model needs attributes expected by its shader. Video-file drops currently report that decoding support is pending.

Image The original node interface and resource viewers.
Image Additional node types extend the available producers and controls.
Video Loading resources directly into the working network.
Video Further original examples of mixed resources and shader processing.
11 · A programmable workspace

The editor can become an image source

The editor and node workspace can render into framebuffers and become image inputs themselves. The same shader graph can project text into a scene or transform its own interface.

The editor also exposes desktop and selected-window capture. Windows capture paths try a modern texture source and retain platform fallbacks; an explicit capture-node control and window selector govern the input. Capture compatibility depends on the application and the available Windows capture path.

Image The editor and its visual presentation are part of the native workspace.
Image A second original capture of the programmable interface.
Video Editing within the workbench.
Video An editor view projected into a rendered scene.
Video The demonstrated external-window integration.
12 · Additional implemented inputs

Audio can become a control image

System-audio loopback and audio-file playback turn measured amplitude into graph resources. Their level history can drive a visual effect alongside the source sound, giving the connection a concrete signal to inspect.

An envelope, not a spectrum

The audio implementation averages absolute sample magnitudes, keeps recent levels and smooths the displayed value. It is an amplitude envelope/history, not an FFT or a frequency-bin analysis. MP3, FLAC and WAV decoding depends on the miniaudio build path.

InputComputed signalHow it joins the graph
System soundAbsolute channel levels, smoothed historyA rendered level-history texture
Audio fileDecoded playback plus level historyAUDIO preview and a small VOL level texture
Selected window / desktopCaptured imageImage input to a shader or frame-history volume
13 · Development practice

Inspect the work behind each frame

The application keeps intermediate images and active connections visible, so a problem can be traced back to the pass that introduced it. The launched build uses the implementation in legacy_sw; despite the folder name, this is the current desktop application. A second graph implementation at the source root remains separate.

The active path builds a render plan from connected components, the projected node and selected special outputs. It caches that plan by graph/selection revisions and visits each node once while constructing the preview order. Separate preview and viewer paths can still request additional evaluations; the plan alone does not guarantee one GPU execution per node per frame.

Video Inspecting a larger network through its intermediate images rather than only the final composite.

Visible activity

Active nodes and links share the render-plan information with their visual overlays. Disconnected experiments can remain on the canvas while attention and work follow the selected component; transient previews have their own invalidation path.

Export and remaining checks

The menu exports network snapshots and can save temporary source first. A .lfnet.json example is included, but a complete save-and-reopen cycle still needs verification. Scheduling performance, capture compatibility and audio behavior also need more runtime checks.

14 · Creator credits

The artists behind the shaders

Description · at a glance

ShaderWeave’s contribution is the desktop editor, graph, resource routing and GPU execution system. Imported shader artwork keeps its own authorship. These credits are transcribed from the retained source headers; the links lead to original works or creator sites.

The recordings show adapted inputs, graph wiring and, in some cases, combined effects. That integration does not make the underlying shader artwork my own.

CreatorWork or examples in the source collection
Inigo Quilez · iqSnail (featured in the hot-swap recording), Clouds, Flame, geometric primitives and fractal studies.
nimitz · stormoidProtean Clouds, Plasma Globe, Auroras, Ether, Magnetismic and Overly Satisfying.
Florian Berger · flockarooInk, ballpoint and oil-paint treatments; computational flockarooid dynamics, Solder and voxel drawings.
Pablo Roman Andrioli · KaliStar Nest.
Reinder NijhoffBidirectional Path Tracer 2, Cameras and Lenses, Matrix Rain and Ray Tracing: The Next Week.
David Gallardo · xjormaIcing Donut, Intestunnel, Morph, Torus and the multipass smoke example.
Stéphane Cuillerdier · AiekickCandy, ray-marched honeycomb and Swirl.
Matthew Arcus · mlaHypercube and Möbius studies; adaptations of Kleinian and hyperbolic examples.
Per BloksgaardRay-traced antigravity jellyfish.
hlorenziHand-drawn Sketch Effect.
bitlessSacred Timeline Anomaly and the surreal/web studies.
P_MalinTimeWarp.
ExplanationAdditional credits retained in the shader collection

The broader source collection also names the creators and contributors below. This is a source-header inventory, not a claim that every listed shader appears in every recording. Some older imports retain incomplete provenance; unverified names are not guessed.

Creator or contributorRetained attribution
Martijn Steinrucken · BigWingsMath Zoo — Alien Orb.
Sébastien Hillaire · SebHBunny volume study.
Ramon ViladomatDesk and planet studies.
Christopher WallisVolumetric ray-marching study.
soma_arc / Kazushi Ahara3D kissing fractal.
evilryu; adaptation by mlaAppo+X fractal.
Jos Leys; adaptation by Matthew ArcusKleinian-group construction.
stb; animation by mlaHyperbolic Poincaré study.
Blackle MoriMonkey and Ribbon Wax.
Pascal GilcherHCURVE_B shader.
al-roLC multipass example.
GLtracyEclipse.
DukeVolumetric Explosion.
XT95Volume raycasting in Cloudy.
dilaTheGrid / Kaleidoscope.
CMHTempered and Vbox.
Leon, as signed in the source headerChain sketch; its header also credits IQ, Mercury, LJ, Koltes and Duke for supporting code.
Leon DeniseTaste of Noise 7.
Mario Klingemann · QuasimondoTrained and customized SIREN model.
Ian McEwan / Ashima Arts; Dave HoskinsNoise and hash routines credited within imported examples.
asalga; phi16; fizzerSupporting sphere-rendering, domain-coloring and vector-output contributions.
DifftyMusic credited by the Inercia Royaliptic example.

Authorship and evolution

Earlier work → current system

I wrote ShaderWeave almost entirely by hand, with AI used during later polishing phases. The original project established the live node-and-buffer workflow; the newer source explores a revised graph interface and execution paths.

The earlier showcase remains available with its original screenshots. Those captures document the existing project history; a new recording should show the current feedback and preview behavior before claiming a performance improvement.

Open the earlier showcase →

Current scope

  • Shadertoy-style inputs and multipass workflows are supported; some shaders or features still require adaptation.
  • The active application includes a network snapshot exporter and saved .lfnet.json examples. A complete import/export round trip remains unverified.
  • Source inspection confirms a cached active-component render plan. Its total preview and GPU cost still needs a focused runtime benchmark.
Explore this fieldComputational photography Drawing with harmonics
Page reviewed September 10, 2026. Demonstrations and technical notes reflect the showcased version.
Project overview