Splatoon's Paint Inspired this Blood System in Godot.
by Vicente C.
Published |
13
Share
In EXUVIA, rainbow blood covers the arenas and drips down walls. Elliptical shares how they built the effect in Godot.
Elliptical spent nearly two years making a Splatoon-inspired game in Roblox. They had to stop working on it, but never lost interest in the ink system.

EXUVIA is not a painting game, but when it needed enemy blood, Elliptical spent about two weeks building a way to cover its levels in splashes without stacking up decals.
The first version used a Sprite2D as a brush inside a Viewport. Elliptical stopped the Viewport from clearing between frames, so every splash stayed in its texture.

A shader put that texture on the 3D level using the mesh's UV2 coordinates. But when blood hit the level, Elliptical still needed to find where that 3D point fell on the flat texture.

Godot did not provide that conversion, so they adapted Alfred Baudisch's texture painting code. The code ran in GDScript, and repeating the calculation for each hit cost CPU time.

Elliptical could have added the function to a custom Godot build, but wanted to keep the Steam version's automatic updates. They sped up the GDScript code by replacing some operations with built-in Godot functions.

When a room loads, the system also saves its mesh triangles and matching UV coordinates in a lookup table. It reuses that data for each new splash. In Elliptical's tests, filling a room with blood does not slow the game down.
When Godot 4.7 added DrawableTexture2D, Elliptical rebuilt the effect. Blood marks now go straight into the texture from code, so there's no need to use the Viewport.

The texture's alpha controls where the blood appears. Elliptical uses noise to vary the cutoff, giving the blood uneven edges. A noise normal map makes the blood catch the light differently across its surface.

Elliptical also varies the color with the alpha level, aiming for the rainbow sheen of gasoline on water.

When a blood particle hits a wall or sloped surface, the system paints a drip below the impact. It uses a raycast to follow the mesh while moving the brush downward, lowering the brush's opacity along the way.
Godot generates the UV2 layout with its automatic lightmap unwrap, which still leaves visible seams in a few places.

You can see the effect in motion and hear more about it here:

Interested in Godot VFX?
We just released our new Godot All About VFX Bundle, it covers shaders, particles, and VFX for 2D, UI, and 3D games with step-by-step examples in over 600 pages of content! ✨
Jettelly wishes you success in your professional career! Did you find an error? No worries! Write to us at [email protected], and we'll fix it!

Subscribe to our newsletter to stay up to date with our latest offers

© 2026 Jettelly Inc. All rights reserved. Made with ❤️ in Toronto, Canada