This document describes techniques for simulating water flow in video games. Artists create flow maps that define vector fields to distort normal maps over time, simulating flowing water. Techniques like dual layers with offset phases and additive noise reduce artifacts from repetition and pulsing. The flowing normal map approach was applied successfully in Left 4 Dead 2 to guide players through levels. It was later extended to flow color maps, allowing debris to flow realistically in the water in Portal 2. The methods achieved convincing water flow effects while meeting hardware constraints for older consoles.
6. Goals
? Visual
¨C Solve repeating texture artifacts
¨C Flow around obstacles
¨C Vary water speed and bump strength
? Technical
¨C Work with existing reflective surfaces
¨C Min hardware ps2.0b (6-year-old hardware) & Xbox 360
? Gameplay¡
7. Gameplay
? Early Left 4 Dead 2 playtests showed players were confused and
got lost often in the swamps
¨C Soft non-directional lighting
¨C Trees provided too much cover
? My theory was that water flow would improve gameplay by
highlighting the correct path
? We tested this theory through playtesting
? In practice, we found testers took 17% fewer wrong turns and
decreased the time it took to traverse the level!
8. Technical Constraints
? Already at perf limits on the Xbox 360 & low-end PC
? Already at memory limits on the Xbox 360
? Our water shader had limited instructions left for our
low end hardware ps2.0b
9. Algorithm Overview
? Pixel shader flow, not geometric flow
? Continue to use a normal map for water
ripples
? Artists author a flow map (a texture
containing 2D flow vectors)
? Use this flow map in a pixel shader to
distort the normal map in the direction of
flow
11. Normal Map Mapped onto Surface
Tiled over the water surface
Normal Map
12. Artists Author Flow Maps
? Flow map provides a unique 2D vector for every point on
the water surface
? Relatively low resolution: ~4 texels/meter
? Impractical to paint directly
? We use Houdini to create vector flow maps
18. Left 4 Dead 2
? Wanted to replace our scrolling normal maps with
flowing normal maps
? Keep the rest of the water shader the same
? This algorithm ultimately provides a new per-pixel
normal generated from the normal map and flow map
19. Related Work
? Nelson Max and Barry Becker 1995. Flow visualization
using moving textures. In Proceedings of the
ICASW/LaRC Symposium on Visualizing Time-Varying
Data, 77¨C87.
? Building on aspects of their algorithm and applying their
approach to flowing normal maps
20. Flow Visualization
? Inputs: flow field & noise texture
? Distort a noise texture to visualize a flow field
? The UV is offset by the 2D flow vector scaled by time
23. Max & Becker¡¯s Observation
? The beginning of the distortion looks convincing
? Only distort a small amount
? In general, distortion looks reasonable for the
first 1/3 of uv space
24. Smoothly Interpolating Layers
? Blend the short animated segment in two layers
? Each layer is offset half a phase so we can hide the
restart for each layer
26. A Great Start
? We now have a method to flow a normal map
? We want to apply this to a larger surface
? But applying this to a large surface means tiling our
normal map which will cause artifacts¡
32. Two Major Problems
? Repetition ¨C The same normals will flow
through the same point on the mesh
? Pulsing ¨C The surface appears to pulse in a
repeating pattern
39. Water Speed Affects Normals
We scale down the strength of the normal in tangent space by the
flow speed (Flow speed is the length of the 2D flow vector)
40. Performance
Compared to scrolling two normal maps:
? Additional texture fetches: 2 - flow & noise
? Additional arithmetic pixel shader instructions: 21
41. Water Flow in Portal 2
? Wanted to also flow debris in dirty water
? Needed to modify our algorithm to support flowing a
color map
46. Flowing Normals
? Flowing normals would repeat
an interval from zero to some
fraction with the peak (center)
of the interval at half distortion
47. Flowing Debris
? Flowing colors works better by
offsetting the interval from ¨C
fraction to +fraction so the
peak of the interval is at zero
(the at-rest position)
52. Future Work
? Flow height maps and use tessellation hardware
? Multiple frequencies of normal maps
? Render dynamic flow vectors per-frame so animated
objects cause flow changes
? Use flow map with our physics simulation to have
objects flow on the water surface using the same data
53. Summary
? Use an artist-authored flow map
? Flow the normals in two layers and combine
? Use noise to reduce pulsing artifact
? Offset each phase of animation to reduce repetition
? Flowing debris uses an offset distortion range that favors
less distortion than the normal flow