Visual slot reserved
The future image should show selective wetness: darker damp zones, glossy puddles, and subtle rain motion without turning everything into a mirror.
UE5 / Recipe / Semi-Realistic Surface
A wetness recipe for rainy streets, damp props, puddles, and surface darkening: roughness shift, normal breakup, puddle masks, and drip timing.
The future image should show selective wetness: darker damp zones, glossy puddles, and subtle rain motion without turning everything into a mirror.
01
Wetness is not only reflection. It is darker albedo, lower roughness, stronger highlights, and local puddle shape.
02
03
A wet surface usually darkens, lowers roughness, changes normal response, and collects water in specific places. Reflection is only one part of the read.
Flat areas, cracks, dents, gutters, low points, and exposed surfaces should become wetter first. Vertical walls and sheltered zones need different behavior.
Damp material is darker and slightly glossier. Standing water is much smoother, may ripple, and may reflect the scene. Treat them as two masks, not one slider.
04
Use vertex paint, height maps, slope, cavity masks, world rain exposure, or a runtime weather value. Avoid applying wetness evenly unless the whole scene is meant to be soaked.
Beginner check: preview the mask alone. You should be able to explain why each white area is wet.
Blend the albedo toward a darker, slightly richer version of itself. Stone, wood, metal, and painted plastic should not all respond with the same darkening amount.
Roughness is the main wetness lever. Damp areas get moderately smoother; puddles get much smoother. Keep the shift masked so the whole asset does not become glossy.
Use height/cavity or painted puddle masks to define standing water. Puddles can receive stronger reflection, flatter normals, and optional ripple motion.
Senior note: puddles on vertical surfaces usually look wrong unless they are streaks or dripping trails.
Use flipbook ripples, procedural circles, or subtle normal animation in puddle zones. Keep them soft unless the camera is close to the ground.
If many materials respond to rain, use a Material Parameter Collection or consistent Dynamic Material Instance parameter names. This keeps world wetness art-directable at level scale.
05
06
float heightMask = Texture2DSample(maskTex, maskSampler, uv).r;
float wetMask = smoothstep(wetMin, wetMax, wetnessAmount - heightMask);
float puddleMask = smoothstep(puddleMin, puddleMax, wetMask);
float3 wetColor = baseColor * lerp(1.0, wetDarken, wetMask);
float roughness = lerp(baseRoughness, wetRoughness, wetMask);
roughness = lerp(roughness, puddleRoughness, puddleMask);
float ripples = Texture2DSample(rippleTex, rippleSampler, uv + time * rippleSpeed).r;
float normalBlend = puddleMask * rippleStrength * ripples;
return float4(wetColor, 1.0);07
Screen-space reflections, Lumen reflections, planar reflections, and reflection captures can all produce different wet reads. Approve the material in the target lighting and reflection setup.
If many materials share wetness, use one naming convention and one runtime parameter path. Otherwise every asset becomes a special case when rain starts or stops.
Rubber, painted metal, stone, cloth, and skin do not become wet in the same way. Keep per-material response controls even if the global rain amount is shared.
08