You're three minutes into a rainy level. You glance down at the cobblestones and see neon signs smeared across the puddles, headlights catching every groove in the road, a surface that looks genuinely soaked through. Your brain files it under wet and moves on. The engine never touched a single water molecule to get there.
One of the most elegant cons in real-time graphics. Once you understand it, you can't unsee it.
The reflection that isn't really there
Actual water physics, the kind that simulates fluid dynamics at any meaningful scale, is catastrophically expensive to compute in real time. So engines don't do it. What they do instead is lower the roughness of a surface and lie about where the light is coming from.
Every surface in a modern game engine carries at least two values baked into its material: albedo (base colour) and roughness (how much it scatters incoming light). A dry concrete road has high roughness. Light hits it and bounces off in fifty directions at once, producing that flat, matte look. Wet concrete has near-zero roughness wherever water is sitting. Light bounces off in one tight, coherent direction. That's specular reflection, and your eye reads it as a shiny liquid layer without any liquid needing to exist.
The engine's job is to dynamically drop that roughness value and then feed the surface a reflection to show. That reflection is almost never the actual scene rendered from the ground's point of view. It's a screen-space reflection (SSR), or a pre-baked cube map, or both layered together. SSR works by sampling pixels already on screen and reprojecting them downward. Cheap, plausible, and it completely falls apart when you tilt the camera at a sharp angle, because the pixels it needs are no longer on screen. You've probably noticed this. Step close to a puddle and the reflection goes fuzzy or disappears at the edges. That's SSR running out of data to steal.
More recent engines layer in planar reflections for flat surfaces, which renders a second version of the scene from a mirrored camera position and stamps it onto the floor. Expensive, but convincing. The rain levels in Cyberpunk 2077 lean heavily on this for Night City's slick streets, and the difference from SSR-only titles is immediately visible.
The mask that decides where it's wet
Roughness alone doesn't close the deal. Water doesn't coat everything uniformly: it pools in crevices, runs off raised geometry, soaks into porous materials at different rates. Engines fake this with a wetness mask, a greyscale texture that tells the shader which pixels should behave as if they're wet.
Picture a brick wall. The mortar grooves collect water; the brick faces shed it faster. An artist paints (or procedurally generates) a mask that sets roughness near zero in the grooves and leaves it higher on the faces. The result is that streaky, uneven wet look that actually matches how rain behaves on real masonry. No fluid simulation required. Just a texture doing the convincing.
Some engines go further and animate the mask over time. Puddles "grow" during rainfall by expanding a ripple normal map, a pre-rendered loop of circular ripple shapes baked into a texture and scrolled across the surface. Think of it like a GIF of water rings, projected onto geometry and dressed up with lighting math. The ripples aren't moving water. They're a looping image that displaces surface normals to redirect light, producing the visual signature of rain hitting a puddle. It works disturbingly well.
The hardware assumption that doesn't hold up
A reasonable instinct is that better hardware must mean more real physics. For wet surfaces, it mostly doesn't. The pipeline described above runs comfortably on hardware from a decade ago. What improves with better specs is the quality of the lie: higher-resolution reflection captures, more accurate roughness interpolation, path-traced lighting that makes specular highlights physically correct rather than approximated.
Here's a concrete example. Two players, same rainy scene, very different machines. The player on older hardware sees a wet road with slightly smeared, low-res reflections. The player on newer hardware sees sharper, more accurate ones. Both are looking at the same fundamental trick. The roughness is still dropped. The reflection is still faked. The water still doesn't exist.
So what are you actually responding to when a rain level looks convincing?
The wetness you find visually believable in games is a lighting problem wearing a physics costume. Engines figured out that your eye doesn't check whether water is present. It checks whether light is behaving the way water makes light behave. Solve for the light, skip the water entirely, and the brain fills in the rest, no complaints filed.