Watercolor effects in games are straightforward once you stop trying to simulate paint physically
Most developers approach watercolor visuals wrong. They try to recreate the actual fluid dynamics of pigment on paper. That is computationally expensive and usually looks wrong because real watercolor has stochastic behavior you cannot easily replicate in a shader. The practical approach is to approximate the visual qualities: soft edges, transparent layering, visible brush strokes, and unpredictable pigment pooling. The term refers to either designing a game mechanic around watercolor painting as a core activity or applying a watercolor visual style across a game's rendering pipeline. I am going to assume you mean the latter, because the former is its own completely different discussion and usually involves a stylus peripheral anyway. For a visual pipeline, the method is simpler than people make it. You build your watercolor look using three main components. A texture-based base layer that mimics paper grain. A soft-blur pass applied per region or per object to create the characteristic feathered edges. And a transparency-driven layering system where overlapping elements reveal color mixing underneath.
The pipeline breakdown
Start with the paper texture. This is non-negotiable. Watercolor without visible paper grain looks like a filtered photograph, not watercolor. Use a high-resolution scan of cold-pressed watercolor paper or purchase a licensed procedural texture. Apply it as a subtle opacity overlay at the end of your render chain. Anything less than 8K grain detail shows up as repetition after two or three frames of camera movement. For the soft edge pass, use a combination of depth-based and normal-based blurring. Render your geometry to a depth buffer and a normal buffer separately. Then run a directional blur that is stronger along edges and weaker in flat areas. This creates the bleeding effect where colors naturally expand into each other. Do not use a uniform Gaussian blur. Real watercolor spreads differently depending on how much water is on the brush versus how saturated the paper already is. A simple distance field from your silhouette gives you about seventy percent of the right look for very little performance cost. The layering system is where most implementations fail. Watercolor is inherently translucent. Colors get lighter where they overlap, not darker. This is the opposite of how most blending modes work in Unity or Unreal. You need a subtraction or additive transparency setup, not standard alpha blending. I recommend using a custom fragment shader that samples previous frame buffers or uses a multi-pass approach with a ping-pong framebuffer setup. Each pass applies a slightly blurred, semi-transparent version of the color to an accumulation buffer. After three to four passes, you get that characteristic washed-out, layered appearance.
Brush stroke simulation
This is the part everyone skips and then wonders why it does not look authentic. Watercolor relies heavily on visible stroke directionality. You can fake this by running your rendered output through a noise-guided directional blur. Generate Perlin noise or Worley noise, use it to create a flow field, and then blur pixels along that field. The result is soft streaks that look like bristles dragging pigment across paper. In practice, I applied this as a post-process effect using a compute shader in Unity. The flow field was generated procedurally from a low-frequency noise texture and cached rather than recalculated every frame. This kept the overhead to about two milliseconds on a mid-range GPU. Without caching, the effect cost roughly fourteen milliseconds and was noticeable during scene transitions.
Get the Full Details
A specific problem I ran into
I was working on a project where the watercolor effect needed to react dynamically to in-game rain. Standard approach: increase the blur radius and push the saturation toward gray. This works fine until you have overlapping translucent objects that are both affected by the rain parameter. The accumulation buffer starts producing muddy brown artifacts because the subtraction blending compounds incorrectly when multiple translucent surfaces shift simultaneously. The workaround was to reset the accumulation buffer every time the rain intensity crossed a threshold, rather than trying to smoothly interpolate through the artifacts. It is a jarring transition if you are not expecting it, so I added a subtle screen-wide fade that matched the watercolor paper color. Players did not notice the buffer reset because the fade masked it. The alternative would have been to recalculate the entire watercolor pipeline from scratch on rain transitions, which would have caused a frame hitch lasting about 180 milliseconds. Neither option is ideal. The fade is the lesser evil.
Performance considerations
A full watercolor pipeline at native resolution on a modern console will consume between eight and fifteen percent of your frame budget, depending on the number of passes. If you are targeting mobile, render the accumulation at half resolution and upscale with bilinear filtering. The difference is barely perceptible because watercolor is inherently soft and low-detail by nature. Upscaling at half resolution typically costs under one millisecond on Adreno 730 or Apple A16 class hardware. If your game has complex lighting, baking your lighting data and applying the watercolor effect in post is significantly cheaper than doing it in real time. I switched a project from dynamic to baked lighting specifically to make room for the watercolor post-process, and the visual quality actually improved because baked lighting does not have the temporal noise that interferes with the accumulation buffer.
When this approach breaks
The watercolor pipeline does not handle high-contrast scenes well. White text on dark backgrounds, bright UI elements, or anything requiring sharp readability will look degraded because the blurring pass intentionally destroys edge definition. Plan your UI as a separate layer rendered on top of the watercolor effect with no blur applied. If you apply the effect globally, you will spend hours trying to recover legibility and fail. Animated characters present another problem. The accumulation buffer smooths across frames, which means moving objects leave trails that linger too long. I solved this by implementing a frame-delta fade rate that increases when an object's velocity exceeds a set threshold. Fast-moving elements fade out of the accumulation buffer quicker, reducing the ghosting artifact. Static or slow-moving elements retain their layered watercolor appearance. This introduces about 0.4 milliseconds of extra computation per object but prevents the most obvious visual bug in the system.

Tools and implementation path
If you are using Unity, start with the URP post-processing stack and build a custom scriptable render pass. There are asset store packages that claim to do watercolor effects, and most of them are just cheap Gaussian blur nodes wrapped in a shader graph. They look acceptable for still images and fail immediately in motion. A custom implementation gives you control over the accumulation logic and the noise-driven flow fields. For Unreal Engine 5, use a custom post-process material and store your accumulation in a custom render target. The Lumen integration complicates things because the reflection pass can bleed into your watercolor buffers. Disable screen-space reflections for objects that will be processed through the watercolor pass, or mask them out before the accumulation begins. Otherwise you will get doubled reflections that look like oil paintings rather than watercolors. There is no single tool that handles this automatically without significant manual tuning. The aesthetic is dependent on your specific art direction, camera distance, and color palette. What works for a serene puzzle game looks disastrous on a fast-paced action title. Test your watercolor pass at the actual play distance you intend, not at close-up editorial shots. The effect degrades noticeably when viewed from a typical third-person camera position because the soft blending removes detail that the brain expects to see at that scale.
Summary of the actual process
Apply paper grain. Blur edges based on depth and normals. Accumulate translucent layers through a ping-pong framebuffer. Simulate brush strokes with noise-guided directional blur. Handle motion with velocity-based fade rates. Keep UI and text out of the pipeline entirely. Accept that high-contrast and high-detail scenes will lose sharpness and plan your design around that limitation. The total implementation time for a functional watercolor pipeline in a prototype is roughly two to three days for someone familiar with custom render passes. Polishing it to production quality, including the edge cases I mentioned, takes about two weeks. Budget accordingly.