For my Fluffy Game framework, Iβve been experimenting a lot with ways to make fur more reactive and dynamic. One of the biggest challenges?
π Making fur react to fluids in real-time and behave accordingly!
This is tricky but possible, so let me explain my technique.
Every character has a body-specific RenderTargetβessentially a texture that exists on the GPU and updates in real-time.
This 16-bit texture has three channels, each representing a different fluid effect in the fur material:
π΄ Red Channel β Wetness (Black = Dry, White = Wet)
π’ Green Channel β Sticky Liquid (Yes, that one... >3)
π΅ Blue Channel β Dirt Accumulation
π The red channel (wetness) fades over time, simulating drying.
π The green & blue channels (sticky/dirt) remain until "washed" away by a fluid marked as water.

(Image showing RenderTarget in action)
Applying fluid effects in real-time without performance issues is a major technical challenge because:
β Per-poly collision is expensive.
β Characters move, making fluid placement dynamic.
My Solution: The PaintJobManager
When a fluid interacts with fur, hereβs what happens:
1οΈβ£ The physics asset (a simplified collision model) detects the hit.
2οΈβ£ The hitβs relative location & rotation are recorded along with the character reference & affected bone.
3οΈβ£ This data is sent to the PaintJobManager, which queues paint jobs.
4οΈβ£ Instead of applying all paint jobs in one frame (which kills performance), the PaintJobManager:
πΉ Applies the latest & a random paint job per frame.
πΉ This ensures many fluids can interact with fur smoothly without FPS drops.

(Image showing character physics asset)
π The result? Fluid interactions happen seamlessly, even if some paint jobs are delayed by a frame or two!
Fur fluid interactions arenβt just visualβthey also affect gameplay!

(Image showing dirt data structure)
β Each character stores wetness/dirtiness values per bone in its Character Structure.
β This means characters have hundreds of points that track fluid interactions.
β This is used for scent mechanics (e.g., wet or dirty fur emits different smells for AI detection).
Since RenderTargets exist only on the GPU, saving fur states for loading later is tricky.
πΎ My solution:
1οΈβ£ Convert the RenderTarget into a list of bytes.
2οΈβ£ Save this list inside the characterβs savegame file.
3οΈβ£ When reloading, reconstruct the RenderTarget from the saved bytes.
4οΈβ£ Use a special shader to initialize the characterβs RenderTarget from this texture.
Painting a skeletal mesh dynamically is very different from painting on a static mesh. My workaround is silly but effective:
πΉ When a fluid paint event occurs, the character temporarily "flattens" like a pancake. π₯
πΉ This is done by stretching the characterβs UVs (texture coordinates).
πΉ A scene capture camera snaps an image of this flattened version.
πΉ A second shader renders the desired paint color onto the flattened mesh.
πΉ The generated mask is then added to the RenderTarget, updating the fluid effect.
π This all happens between frames, so you never notice itβbut technically, every time you make a character dirty, they briefly turn into a pancake. π

(image showing character turned into pancake)

(Image showing Shader responsible for making 3d object into flat 2d uv representation)
The fluid is driven by a particle system that dynamically tracks and connects particles to create a fast, real-time 3D fluid simulation. Each fluid strand can:
β Attach to objects (sticky behavior).
β Paint onto surfaces at any point in 3D space.
This allows for realistic interactions, making fluids feel dynamic and natural within the game world.
Fur has two distinct states depending on whether itβs wet or dry:
β Wet Fur β A separate undercoat is revealed, featuring shorter, denser hair that clings to the body.
β Dry Fur β The overcoat returns, becoming fluffy and soft, just as you'd expect~ :3
Additionally, fur reacts dynamically to dirt:
π€ Dirt accumulation affects fur color over time.
π€ White, creamy fluids leave visible stains even after drying.

This system ensures fur looks and behaves naturally, adapting to environmental interactions in a believable and immersive way.
β Realtime, performance-friendly fur fluid interactions.
β Wetness, stickiness, and dirt persist and influence game mechanics.
β Characters dynamically change based on their environment.
β No noticeable performance hit, even with lots of fluids!
Next up, Iβll show you The level generation process and the differences between the Cell and Grid type generators i made!
β₯u,
Your furrier πΎ