nyx.vfx: NebulaDrift VFX

Overview The NebulaDrift is the new kid on the block. It's a cloud-style effect (e.g., fog, smoke, haze). It was inspired by the effects of spell casts in old-school cRPGs. The image above is from Baldur's Gate 2, which predates the implementation of programmable shaders…

VST3: Scheduling Midi Events

Overview Scheduling midi events is not as straightforward as one might think. We have to work with samples and sample rates rather than strictly with time (e.g., in 3 seconds do this, then stop in 2 seconds). There's some confusing nomenclature and there are some midi gotchas…

VST3: Controller ↔ Processor Communication Strategies

This post is intentionally long because it focuses on design constraints, not just APIs. These are the kinds of constraints that routinely trip up even experienced C++ developers. VST3 development has more in common with embedded C/C++ than typical desktop software: tight timing budgets, strict threading rules, and zero…

nyx.vfx: plugin

Overview nyx.vfx is a real-time 2D VFX engine that creates particle systems for midi events. It's a work-in-progress, but that shouldn't take away from making cool designs and exporting them for use in post-processing and video-editing tools. Tweaker's Dream The nyx.vfx plugin…

nyx.vfx: S02 PreShader Pipeline - Density Field

Density Field PreShader Accumulation, Decay, and Blob Stamps Remember from Series 01 (PreShader Pipeline Architecture) that a PreShader gathers one piece of information about the texture after the Mesh stage. A PreShader is an immutable adjunct texture that Shaders can choose to utilize. The first PreShader I built for nyx.…

nyx.vfx: Feedback Shader Redesign

Overview: From Overlay Hack to Real Temporal Feedback The original "Feedback Shader" in nyx.vfx didn't actually use a shader. It used an overlay technique: draw a full-screen rectangle every frame, then blend the current input on top. It worked, but it wasn't real…

nyx.vfx: Expiration Scheduler

Terminology In this post, a "Mesh" refers to a single renderable line segment (internally treated as an edge). Higher-level meshes are just emergent behavior from many lines. A look ahead Let's start off with where we're going first. Here's a gif demonstrating…