All projects

Graphics · In development

Impressionist Oil Paint Shader

A Unity 6 post-process effect that repaints every rendered frame as layered, edge-following oil brush strokes.

A woodland path repainted as layered impressionist brush strokes, with birds scattered across a dappled pink-and-blue sky

I’m building a renderer feature for Unity 6’s Universal Render Pipeline that turns a rendered 3D scene into an impressionist painting, live, every frame.

How it works

The effect runs as four passes:

  1. Image analysis. A compute pass studies the frame at quarter resolution and works out the dominant edge direction and the amount of detail everywhere in the image.
  2. Stroke painting. Layers of brush strokes are painted from coarse to fine. The strokes follow the edge flow underneath them, with a little controlled variation so they never look mechanically aligned.
  3. Relief lighting. The paint gets a thickness, and that thickness is lit to give the strokes an impasto look.
  4. Temporal blending. The painted frame is reprojected with motion vectors and blended with its history, so the strokes stay steady instead of shimmering when the camera moves.

Under the hood

  • A GPU-driven path generates the strokes in a compute shader and draws them indirectly, with an automatic fallback on hardware that doesn’t support it.
  • Everything runs through Unity 6’s RenderGraph API.
  • Colour harmonies in the OKLab colour space (split-complementary, analogous, complementary, triadic, warm/cool and limited palettes) keep the painting coherent.
  • Stability work: strokes are rejected across depth gaps, temporal blending is hue-aware, and history resets on camera cuts.
  • A set of debug views, from stroke orientation to motion vectors, shows what each pass is doing.
  • It ships as a Unity package, so it drops straight into other projects.
A sunlit meadow and wooden fence at a tree line, repainted with the same edge-following oil brush strokes
Brush strokes following the edge flow of grass, foliage and fence rails.
A frame where the brush strokes have overgrown into a shapeless tangle of blue, green and purple, with a performance stats overlay visible in the corner
An early pass where the strokes fed back on themselves and the frame dissolved into colour soup.
A forest path rendered with blocky, jittering brush strokes that break up into pixelated artifacts instead of smooth paint
Round two: fixed the colour soup, broke the temporal blending instead — strokes turned blocky and swam between frames.

More projects

Games · Playable prototype

WarDesk

A two-player strategy game where both sides plan their orders in secret, then watch toy-soldier armies clash all at once.

Read more

Apps · In development

Spijs & Vree

A meal-planning app for households: everyone swipes on recipes, and the matches go on the menu.

Read more

Writing · Finished script

Geen Paniek

A three-act stage play in Dutch: a handful of survivors on a life raft, adrift on a sea of ball-pit balls.

Read more