An awakewithai.com production
The physical specification behind Just a Tropical Beach — a beach that is not drawn but solved. One system, followed all the way down: the ocean that arrives, the instability that breaks it, the shore that absorbs it, the light that makes any of it visible, and what the water leaves behind.
A beach is not a picture of a beach. It is a coupled dynamic system that happens to be visible.
Almost every synthetic ocean is built the wrong way round. Someone decides what the water should look like — blue here, white there, a wave-shaped object that plays a crashing animation — and then spends enormous effort making the decision look convincing. It never quite does, because the eye is extraordinarily good at detecting an effect that has no cause.
The alternative is to specify the rules and let the appearance be a consequence. Water moves because of pressure and gravity. Waves change because the depth changes. Waves break because they become unstable. Swash runs up because it has momentum and runs back because of gravity. Water vanishes into the sand because sand is porous. Foam is white because a dense cloud of air–water interfaces scatters light many times before any wavelength is preferentially absorbed. Sand darkens because water displaces the air between its grains.
None of those are visual decisions. All of them have visual consequences. The whole specification below is an attempt to state the rules precisely enough that the picture has no choice but to emerge.
Read left to right, nothing in that chain is a rendering trick. Each stage is the input to the next, and the last one is the only one you actually see.
One sine wave is a swimming pool. A sea is a sum.
Use a right-handed frame: x across the shore, y along it, z up. Still water is z = 0, the ocean occupies x < 0, and the bed is a surface z_b(x,y). The instantaneous water depth is the difference between the free surface and the bed, and the shoreline is simply the contour where that difference vanishes.
The offshore surface is a superposition of components, each with its own amplitude, direction, frequency and — critically — a random phase:
Gravity waves obey a dispersion relation that depends on depth:
As the wave slows, its energy is compressed into a shorter wavelength and a taller crest. Height and steepness both rise:
Because speed depends on depth, a wave arriving at an angle travels faster in its deeper part and pivots. It is Snell's law with the same structure as optics:
Real waves do not arrive as identical soldiers. They arrive in groups, and a wave inside a strong group breaks harder than an isolated wave of the same nominal height:
Group structure is easy to add and easy to overdo, and overdoing it does not look like bigger sets — it looks like a flat sea that occasionally produces a monster. A linear random sea is Gaussian to first order: kurtosis 3, Rayleigh-distributed heights, and a largest wave in N of about √(½ ln N) times the significant height.
Here is the most useful thing to know about making waves, and it is not obvious until you measure it. Raising the swell offshore does almost nothing to the wave that reaches the beach. Not a little — almost nothing. Every wave arrives at the shore already broken down to what the water depth there permits:
Which means that if you want an occasional bigger wave at the beach, the amplitude of the sea is the wrong dial, and so is the grouping. Widening the group envelope makes the big sets relatively bigger but — because the envelope is normalised on its mean — pulls the typical wave down, and raising the swell to compensate runs straight back into the ceiling. Measured over matched runs, that combination made every wave smaller.
The dial that works is the ceiling itself. Two ways to lift it: gamma, which is a property of the bed slope and not a constant to be borrowed from a textbook; and the water level, because h is what gamma multiplies. The second is the interesting one — a real beach already does it.
Groups do not only make waves arrive together. A group of large waves pushes extra water shoreward and holds the level up beneath itself; the lulls between let it fall. The result is a long oscillation of the water level at a period far below any individual wave — two or three minutes down to twenty seconds — and it is the reason a beach visibly surges and withdraws over a timescale nothing in the wave field explains.
It is a strong lever and worth handling carefully: the response is nonlinear, because the biggest waves are exactly the ones held back by the ceiling, so they gain most when it lifts. Tripling the infragravity amplitude here doubled the whole sea rather than adding the occasional set.
The crash is not an object. It is an instability propagating through a fluid.
A breaking wave is usually animated as a shape that turns white and falls over. Physically it is a continuous loss of stability with a definite cause: the water near the crest begins to move faster than the shape that is carrying it, and at that point the crest can no longer stay attached.
The classical index compares wave height to local depth. The more fundamental criterion compares the crest's particle velocity to the wave's phase velocity — a Froude number:
The same incoming wave produces a completely different break on a different beach. The surf similarity parameter predicts which:
| ξ₀ | Type | Character |
|---|---|---|
| low | Spilling | crest aerates and tumbles; no hollow; long turbulent face |
| moderate | Plunging | lip throws forward, encloses air, impacts the face |
| high | Collapsing | face collapses without a clean overturn |
| very high | Surging | wave surges up the face with little breaking at all |
Once the crest detaches it is a projectile. It leaves with the crest's own velocity plus a throw that scales with √(gH), and from then until impact it is under gravity alone:
There is a single number that decides whether a wave can overturn, and it is worth stating on its own because everything else is downstream of it. A crest does not stand still. It travels at the characteristic speed u + √(gh) — that is precisely why crests steepen and overtake their own troughs. So what matters is not how fast the lip is thrown, but how fast it is thrown relative to the crest it is leaving:
The same criterion appears again, independently, from the rendering side. If the drawn surface is displaced along the trajectory, x′ = x + U_j τ, and age and position are locked together along the band, then dx′/dx = 1 − Λ — and a fold, meaning a genuinely multivalued drawn surface, needs that to go negative. Same inequality, arrived at two different ways.
The ratio of the two launch components then decides something separate: whether the throw pitches over or merely shoots flat. A plunging lip rises about a quarter to a third of a wave height above the crest, reaches a little over one wave height forward, and enters the water steeply — 60° or more. That steep entry is what completes the rotation, the going over and down and back under. A flat, fast throw with the same Λ clears the crest and never comes back over itself.
The criterion above ends in an impasse. Overhang requires a multivalued surface — two water heights above one ground point, the lip out in front and the body beneath it — and a depth-averaged field h(x,y) cannot represent that. It has one value per column by construction. Refining the grid does not help; the limitation is in what the variable is.
The resolution is to stop asking one surface to be in two places, and to draw the water twice from the same state:
The order matters. The lip is drawn after the body and does not write depth, so the body stays visible through the sheet — which is the whole point, because a thrown sheet of water is thin enough to see the wave through. Draw it depth-writing and the barrel fills with an opaque tongue and the effect collapses.
Once the sheet is out in front of the body, the camera can see under it, and a fragment on the inside of a curl is a back-facing one. Every shading term that uses a normal is then pointing the wrong way, and two corrections are needed — one geometric, one about how far the light has actually travelled.
That is why a real barrel glows. You are looking at a backlit pane of water a few centimetres thick with the sun on the far side, so it transmits its own colour at high intensity — the green-gold that no amount of reflected sky will ever produce. Aeration is raised slightly, because a thrown sheet is full of bubbles; foam coverage is lowered, because a thin sheet lit from behind reads as translucent rather than white.
At impact the jet's kinetic energy is redistributed, and none of it goes back into the wave:
A plunging jet does not merge with the water it lands on. It penetrates, drives a wedge of water ahead of it, and that wedge is thrown up and forward as a second jet — which can itself overturn, land, and do it again. Photographic sequences of real breakers show two to three of these cycles, and they are most of what makes a crash look violent rather than merely white: the whitewater keeps relaunching itself ahead of the break.
Store the throw as a single record per point — age, speed, rise — and the cascade above costs nothing, because each relaunch simply overwrites the last. That works perfectly for the impact it delivers. It fails completely for what you see, and the failure is easy to miss because nothing about it looks broken:
And that overlap is precisely what a completed crash looks like. Watch any plunging breaker: the curtain is still pouring down while the splash-up is already climbing in front of it, and often a third sheet behind that. A crash drawn as a clean handover from one stage to the next reads as almost right — everything is in the correct place at the correct time, and it still looks like a sequence of events rather than an event.
The fix is not a finer grid; no resolution helps, because the limit is in what is stored rather than where. Three records per point, each with its own drawn surface. An arrival hands r of its speed to the generation behind it and keeps its own place in the air.
Treat the thrown lip as a body in free flight and its whole character is fixed by two constants. Reach, rise and entry angle stop being independent:
So raising C_j until the lip could overhang produced a tongue six wave heights long, and pulling C_w back to shorten the tongue flattened the entry. Every setting trades one against another because the projectile has only two knobs for three quantities.
But a real lip is not in free flight. It is still attached: the sheet behind it is in tension, and the air cavity it is closing over is collapsing and pulling it in. That is precisely why a real plunging lip comes down at sixty degrees or steeper while reaching only about one wave height forward — a combination the ballistic model says is impossible.
The tip arriving is only half the collision. The water it lands on is driven out of the way and thrown upward around the line of impact — and on a plunging breaker that line is the crest, so what goes up is a curtain along it rather than the circular crown a single droplet makes. Same mechanism, different topology.
It must also be white. Drawn as a displacement alone it is a bump of ordinary sea, because the raised surface is shaded exactly like the water it was raised from. Water thrown up by an impact is the whitest thing in the scene — shattered and full of entrained air before it is properly airborne — and keying the foam to the crown height gives the gradient for nothing: solid at the root, spray at the top.
For the second or two after the arc finishes, what the eye reads as the wave breaking is not the lip at all. It is the roller: a recirculating mass of aerated water riding the front face, carried at the wave speed, with a cross-section of order 0.9 H² (Svendsen 1984). Drawn as a flat lid of foam with isotropic noise on it, it is a boiling pot. Two properties noise cannot have:
There is a second, smaller thing that keeps a crash from reading as complete, and it hides in a single line of bookkeeping. When the tip arrives, the throw is over — so the record is cleared, and the sheet stops existing between one frame and the next.
One trap, for anyone implementing this. It is tempting to flag "landed, now sinking" by making the age negative — one field, and the sign is free. It does not survive contact with a filtered texture: the state is read back through the flow with linear interpolation, so a flying age and a sinking age get averaged, and +0.30 mixed with −0.10 is not a state any parcel was ever in. Keep the age monotonic and let it run past t_land.
Each rung of the cascade is launched by rotating the previous velocity upward and scaling its magnitude — the rotation is what makes a splash-up read as its own event rather than a smaller copy of the throw. But the flight time was being recovered by inverting the launch relation, which is exact only for the primary curtain, whose vertical speed really was set by the wave height. Feed a rotated velocity through that inversion and it manufactures a wave height out of the rotation angle:
The fall is therefore a property of the throw, not something recovered from it. The primary curtain falls the height the crest gave it; a splash-up leaves the surface at the impact point and lands forward of it, where on a shorebreak the ground is rising, so its fall is at or below zero and zero is the correct neutral. Zeroing it shortens the cascade, which is restored where it belongs — in the window over which a landed tip sinks into the water, which is what a splash-up actually spends that time doing.
There are four rungs. The hand-off is geometric, so three ran out while there was still visible water in the chain: a real run-up ends as several sheets, each thinner and slower than the last, overlapping because the one in front is still draining when the next lands on it.
Large cavities are unstable and break down through a size cascade that conserves volume, then dissolve at a rate that depends on radius:
Foam is a field with its own transport equation, not paint applied to the surface:
After the crest collapses the remaining momentum travels shoreward as a turbulent hydraulic transition, and its leading edge is where the whitewater concentrates:
A realistic wave should never simply turn white and fall. The bottom slows it; the crest keeps going; the upper water outruns the shape beneath it; a sheet becomes a jet; gravity takes the jet; the jet hits the face; the impact traps air; the air becomes bubbles; the bubbles become foam; the remaining momentum becomes a bore; the bore becomes swash. The crash is one event inside a much longer process
The beach is the only part of the system with a memory.
Everything from the surf line to the top of the swash is one solver — mass and momentum over a moving wet/dry boundary:
To first order the swash front is a projectile running up a ramp, which gives a surprisingly useful estimate of runup:
But real swash loses energy in several ways at once, and the deceleration is strongly nonlinear:
Sand is porous, and a great deal of every wave simply disappears downward rather than flowing back:
Uprush and backwash have different durations, different distances and different velocities. A simulation that mirrors them looks mechanical:
The beach remembers the last wave, and the one before it. Wetness is a field with a decaying memory, and the whole visual character of the swash zone comes from its overlap with the next wave:
It is tempting to drive brightness, roughness and specular response from that one field. It is also wrong, and the error is worth stating plainly because it is easy to make and hard to see. Two different mechanisms darken sand, and they run on timescales a hundred apart.
Collapse them into one scalar and the mirror becomes tied to the drying rate. With a specular threshold at W_b ≈ 0.53 and λ_d = 0.011 s⁻¹, the beach keeps a sheen for fifty-eight seconds after the water has gone. The whole shallow zone then ages at one rate, and the wide matte-dark band — pores full, film gone, which is the state a real beach spends most of its time in — cannot exist at all.
Below roughly a grain diameter a film cannot stay continuous over a rough surface. It pins on the high grains, drains into the hollows, and breaks into patches and rivulets with dry islands between them. This is why the last water on a beach does not slide back with the wave — it stays where it is and disappears in place, which is a different motion entirely and one of the clearest signatures of real swash.
The shoreline is where two surfaces meet that were computed by different means: a water mesh carrying the solver's depth, and a sand mesh carrying two to four centimetres of sub-grid relief the solver never sees. Every visible fault at that join — bare sand showing through a retreating sheet, an advancing tongue breaking into islands — is the same arithmetic mistake wearing different clothes, and it is worth stating as a rule because the rule is what fixes it, not the tuning.
The water is drawn where its depth clears a threshold. So any term that can reduce that depth can push it under, and a hole opens. Most of the tempting terms are signed, and a signed term does not have a good setting — it has two bad ones:
The way out is not a better constant. It is to require every term touching the edge to be monotone — able to move the result in one direction only — so the failure stops being expressible rather than being tuned away.
The foam term is worth its own line, because it looks physical and is not. A raft of foam does float proud of the water it sits on — but of the water it sits on. Lifting the surface by a fixed amount wherever foam is thick will hoist a millimetre-deep sheet three centimetres clear of the sand, and where the foam is patchy the lift is patchy, so the sheet breaks into floating lumps. Archimedes, roughly: how far a raft stands proud is set by the column supporting it, which makes it a proportion of the depth and not a constant.
The longest-running fault at this join was not at the join at all. Foam is one advected tracer field, and both surfaces were drawing it: the sand painted stranded foam wherever the field was non-zero, and the water painted floating foam on top of the same field. Deliberately differently, too —
The physics has no two layers in it. Foam is either floating or stranded. Floating foam goes with the water and the water draws it; stranded foam is what the water left behind, and it cannot be left behind somewhere the water has not left yet. So the sand's copy fades out on the complement of the water's own opacity, and neither is ever drawn over the other.
The general lesson outlives the fix: when a fault will not respond to tuning, the question is not which constant is wrong but how many times the same quantity is being drawn.
Wetness ran ahead of the waterline for a long time, and three separate mechanisms were each doing it. Two were thresholds. The third could not be fixed by any threshold, because the number itself was being read from somewhere else.
Every tracer field on the sand is sampled through a noise warp, which exists to hide the solver's 19 cm bilinear steps. That warp reaches up to 0.8 m in an arbitrary direction — so wherever it happened to point seaward, sand ahead of the water sampled saturation from behind the water and came back wet. The cure is the asymmetry used everywhere else here: take the minimum against the unwarped sample, and the warp can still find drier ground and cut the contour in, but is arithmetically incapable of finding wetter ground and pushing it out.
The other two were ordinary once found. Saturation began accumulating at 0.2 mm of depth while the renderer does not draw water until 0.6 mm — two contours from two constants, with no reason to agree — and a lateral wicking term diffused saturation into cells the water had never touched. That one was deleted rather than tuned: suction between grains moves water millimetres, not the 19 cm a cell of this grid spans, so at this resolution it was never modelling anything real. The threshold now evaluates the renderer's own cut field, so the two contours are the same contour by construction rather than by agreement.
A backwash gets its shape for nothing. It drains down channels it cut itself, so its outline is channelised — tongues and interfluves with a direction and a hierarchy — and no amount of noise reproduces that. Noise gives a wiggly line, and the eye tells the difference at once.
The same micro-topography steers water going the other way. A run-up runs further up the channels and is held back on the ground between them, which is why swash tongues and backwash rills line up on a real beach: one field, two directions. The solver already keeps the flow accumulation that records where the draining water concentrated — the sand has been drawing its rills from it all along — and it had simply never been offered to the water.
Before the rills, the edge was fingered by noise, and it kept coming out evenly scalloped however many octaves went into it. The reason is geometric rather than spectral: isotropic noise displaces a contour by the same amount in every direction, and a contour pushed equally in all directions bulges into round lobes. That is a scallop. Adding octaves only puts smaller scallops on the larger ones.
Fingering at a moving contact line elongates along the flow. On a beach the flow is cross-shore, so the tongues are long and narrow and point up the beach — the same geometry the retreat gets free from its rills. The noise is therefore sampled in a frame squashed three to one across shore and displaced with a cross-shore bias. The total reach is bounded at about half a metre, which matters: pushed to nearly two metres it samples depth from well behind the front and draws it out as filaments of water lying on sand the swash never reached.
The water fades in over a range of depth. But what the eye sees is that range divided by the local depth gradient, and the gradient is not a constant: a fast arriving bore climbs steeply behind its toe, so a fixed few millimetres of ramp collapses into a few pixels and the edge goes hard, while the same ramp on a slow sheet spreads into a wide soft band. Identical numbers, opposite results — and it is the fast front, the one that matters most, that comes out worst.
A depth-averaged solver carries one depth per cell, and a real sheet has structure below that at its edge. The retreat had a residual film for exactly this reason for a long time — and the argument never mentioned direction. An arriving sheet has the same problem at its leading edge, where the true profile runs to tenths of a millimetre over a distance the grid cannot resolve.
So the film is mirrored: same gate, same thinness window, same amount, with the sign of the flow flipped. It cannot reach dry ground, because where there is no water the flux and the depth are both zero and the term goes with them. Once it existed, every advance-only shading curve that had been added to compensate for its absence could be deleted — two ramps that differ are two edges that differ, and the retreat's was the one that was right.
The edge of a sheet running over sand is not simply where the depth reaches zero. Surface tension holds a bead there, and its width is set by the one length that balances capillarity against gravity:
This is the bright thread along the front of every advancing sheet, and the outline that survives on a retreating one. A millimetre-scale effect that is plainly visible from ten metres away, because a curved specular strip gathers light from a wide arc of sky and sends it to the eye — the same reason the wet rim of a glass catches light.
Standing on sand is a mechanics problem with three separate outcomes, and a beach shows all three at once. Peak load is roughly 1.2 body weights walking and 2.6 running, and the sand answers differently depending on how much water is already in it.
The pale halo is the counter-intuitive one, and worth stating plainly because it looks like a rendering error: the sand around a fresh print on saturated beach goes lighter, not darker, and stays that way for a second or two before capillarity refills it. It is the surface draining into pore space that the shearing has just opened. Ponding is the reason a line of prints survives a swash that runs over it — the flat sand drains and pales in seconds, while the hollows stay dark for minutes.
Stride is not a cadence multiplied by speed. A walk lengthens its step with speed and keeps a slow cadence; a run jumps to a much longer step at a cadence that then barely changes — which is why runners' prints are far apart and evenly spaced however hard they are running.
Grains mobilise when bed shear passes a threshold, and the bed evolves to conserve sediment:
Two motions much slower than the waves keep the shoreline from looking periodic: bound long waves, and the tide.
The sun does not colour the beach. It illuminates a continuously changing optical system.
Light leaves the sun, is filtered and scattered by the atmosphere, meets a surface whose orientation is changing everywhere at once, splits into a reflected and a transmitted part, travels through water that absorbs it unevenly by wavelength, bounces off pale sand, comes back out, and only then reaches a camera that has to compress an enormous dynamic range into an image. Every one of those steps is a place where a shortcut becomes visible.
The water surface has a normal that varies continuously in space and time. Every ripple is an independently oriented mirror:
A glint occurs where the local normal happens to bisect the sun and view directions. Because the surface carries an enormous population of normals, a sparse and constantly changing subset satisfies the condition at any instant:
The sun is not a point source. It subtends an angular radius of 4.65 mrad, so no specular reflection of it can be narrower than that, however smooth the water is. Convolving the disc with the microfacet lobe adds in quadrature:
The moving surface acts as a lens, focusing light into bright moving networks on the bed. Their brightness is the inverse of how much a bundle of rays has spread:
A caustic net is not a property of the water. It is light on the bed, and the bed is not seen where it is: refraction displaces the sand along the view ray by up to about a depth laterally, which is a function of the camera. Compute the net at the surface point and paint it on a bed sample taken a metre away and the pattern slides across the sand as the viewer moves, in the opposite sense to the sand texture underneath it. That parallax — a pattern that swims relative to what it is lit on — is the signature of a caustic living on the water instead of on the bottom, and it is entirely a bookkeeping error.
Foam is not white because it is painted white. It is a dense population of air–water interfaces; light entering it refracts, reflects internally, meets another interface and scatters again, and after enough of those events wavelength-dependent absorption has barely had a chance to act:
Whitewater is the brightest thing in a surf frame, and the temptation is to reach the look by raising its gain. Measured thick fresh whitecap reflectance is 0.5–0.6 broadband and 0.7–0.9 in the visible; a passive surface cannot exceed 1 by definition. Four separate sites here normalised whitewater to effective albedos between 1.38 and 1.85, which put sunlit foam at roughly five times sunlit dry sand where the physical ratio is nearer 2.6.
The correction is not a single scalar, and that is the interesting part. The direct and ambient halves of those expressions are in different units — one an irradiance, one a prefiltered radiance — so while the direct half was well over one, the ambient half was already close to a factor of two under. Cutting both by the same number fixes the overshoot and doubles the undershoot, which shows up as backlit foam and overcast foam losing half their light. The two channels have to be separated: direct brought down to a legal albedo, ambient rescaled so that every shadowed value is unchanged.
Drag on a falling droplet is linear in its velocity only in the small limit. The inertial law that fits millimetre rain — terminal speed proportional to radius — is right for the ballistic arcs the eye follows, and wrong by more than an order of magnitude for the fine fraction, which is most of the population by number:
What this buys is not a detail of the arcs, which are unchanged: it is wind-blown mist, which otherwise does not exist. A forty-micron droplet settles ten centimetres over its whole life while the wind carries it ten metres, so a plume leaves a drifting veil behind it instead of raining straight back down.
A retreating swash leaves a film one to ten millimetres deep. For a few seconds the beach is a water surface with its own normals and its own glints, and then it is not:
Direct sun, bright foam, mid-water and shadow span something like nine orders of magnitude. The renderer must carry that range and only compress it at the very end:
Everything above is water. The last of the realism is in what the water leaves behind — the sand it sorts, the film it cannot quite take back, and the stones it drops — and in one discipline that governs all of it: when you draw something explicitly, you must take it away from whatever was standing in for it.
Wind ripples on dry sand are the most-drawn and least-convincing feature of any beach, and the reason is topological rather than aesthetic. On a real bed, crests end: one crest forks into two, a neighbour dies out between them, and the field is full of these terminations. Describe the field by a phase φ whose level sets are the crests, and a fork is a point where the phase is undefined and must wind by a full turn around it.
The repair is to put the winding in on purpose, as dislocation dipoles: a matched ±1 pair per cell, so the far field is untouched and the near field contains exactly one crest that begins and one that ends.
A detail locked to the world and sampled on a mesh locked to the camera does not simply disappear when it goes under Nyquist. It beats, and the beat is smooth, large and stationary in world space — which is precisely the signature of something deliberate.
The same mistake turned up three times in three unrelated places, and it is worth stating as a rule. A statistical model — a roughness, a slope variance, a sheen — is a stand-in for structure too small to draw. The moment you draw that structure, the stand-in has to go, or the surface carries it twice.
Its mirror image is the invariance the other way. Add an occlusion field and you have darkened the surface by its areal mean, so the albedo has to rise to meet it — otherwise the beach dims as you walk toward it and the detail switches on.
A depth-averaged solver has one depth per cell and a cell nineteen centimetres across, so the last millimetre of water on a beach is invisible to it. But that millimetre is most of what the eye reads on the swash face, and it does not go all at once. It goes in tiers, each with its own optics and its own time constant.
Pick up a stone on a beach and it is flat. Pick up twenty and they are all flat. That is not a coincidence and it is not a choice a renderer gets to make — it is the shape that particular flow produces, and getting it wrong is visible from thirty metres.
A pebble in a swash zone is worked by a flow that reverses twice a wave. Under that regime it is rolled about its short axis far more often than about its long one, so its two broad faces spend disproportionately more time being abraded than its edges do, and the shape converges. In Zingg's classification of clast form — the two ratios b/a and c/b of the three principal axes — beach clasts pile into the oblate quadrant: discs and blades, hardly ever a sphere and hardly ever a rod.
A disc in a reversing flow does not settle flat. It comes to rest with its broad face tilted, dipping into the last strong flow that touched it — and on a beach face the last strong flow is always the backwash, running seaward. So they dip seaward, and crucially they all dip the same way. This is imbrication, and it is one of the oldest indicators in sedimentology precisely because it is so reliable.
Once an object can come to rest in any attitude, placing it by a fixed height is wrong in both directions: one that rolled onto its narrow side floats, and one that rolled onto its broad side sinks. What is needed is the lowest point of the rotated body, which is its support function in the downward direction — and for a box that is exact and costs three multiplies.
Anything standing proud of a sheet flow accelerates the flow around itself and digs. A clast therefore sits in a shallow moat, with a tail of scour trailing away downstream — on a beach face, seaward again. It is the same hollow you find around a stone in a stream, and the eye recognises it without ever having been taught the name.
Nothing else in the scene changes as much between dry and wet as a stone does, and the reason is not that water is dark. A dry stone's surface is a field of micrometre pits left by the same sand that rounded it; light entering a pit has many chances to scatter back out without ever penetrating the rock. Fill the pits with water and the refractive index step at the surface drops from 1.60 : 1 to about 1.20 : 1, so far more light goes in, takes a long absorbing path through the rock, and comes back out attenuated.
Scatter anything uniformly over a beach and the eye reads it as scattered. A beach does not scatter — it sorts, by weight, and it does it along a line, because the process doing the sorting is a sheet of water running up and back along one direction.
A scene like this is solved out to about eighty metres and approximated beyond that, and the two surfaces overlap. Where they overlap they have to agree to within the quantisation of the frame buffer, or the handover is a visible line — and the culprit is almost never the blend. It is that the far surface was given a plausible-looking stand-in for something the solver already knows exactly.
Two of the day's longest detours were caused by trusting a measurement, and both are worth writing down because both are silent.
One vector defines the physical personality of a beach.
Every appearance in the scene descends from a single parameter set. Change one entry and the beach changes character without anything being redrawn:
| Parameter | Value | What it sets |
|---|---|---|
| β | 0.075 face | the swash-built slope of the beach face |
| H_swell / T | 1.35 m / 11.5 s | deep-water swell, before the reef takes any of it |
| H_wind / T | 0.74 m / 4.5 s | local chop riding on the swell |
| d₅₀ | 0.42 mm | median grain — sets permeability and colour |
| K_p | 1.4 × 10⁻⁴ m/s | how fast the sand drinks the swash |
| γ_b | 0.88 ± 0.055 | the depth ceiling — what actually sets height at the beach |
| λ_f | 0.82 s⁻¹ | foam decay — how far rafts travel before bursting |
| A_IG / T_IG | 0.18 m / 55 s | surf beat — the ceiling rises and falls with it |
| reef | 258 m offshore | filters the swell to ~0.55 m at the beach |
| clarity | 0.72 | divides K_d — how far you see into the water |
| C_j / C_w | 2.00 / 1.05 | the throw: mean Λ 1.2–1.8 inshore, entry 39° |
| a_g | 0.62 | set envelope — how unequal successive waves are |
| exposure | 5.5 | the camera, not the physics |
| α_s | 65.5° | sun elevation — near-noon tropical |
A convincing scene carries several scales at once, in space and in time. Missing the small ones is what makes an otherwise correct simulation read as computer graphics.
| Scale | Space | Time |
|---|---|---|
| Large | wave envelope, crest, trough, bore | tide, morphology — minutes to hours |
| Medium | foam patches, jets, vortices, splash crowns | waves, swash, backwash — seconds |
| Small | bubbles, droplets, ripples, foam filaments | foam breakup, spray — sub-second |
| Micro | air–water interfaces, capillary waves | milliseconds |
With limited resources, the components that carry most of the realism are: a stochastic wave spectrum; shallow-water propagation; a breaking threshold; a dynamic shoreline; uprush and backwash; infiltration; wet-sand memory; foam generation and decay; depth-dependent water colour; Fresnel reflection; dynamic surface normals; sun glints; bottom reflection; shadows that stay blue rather than black; and an HDR exposure at the end. Fifteen systems, and the rest is refinement.
Do not tell the environment what a tropical beach should look like. Tell it what rules govern water, sand, waves, gravity, air, sediment, foam, bubbles, terrain, sunlight and time — and then let the shoreline emerge. The final generative principle
The most convincing virtual beach is not a photograph recreated by mathematics. It is a mathematical ocean and a mathematical beach allowed to produce the photograph as an emergent result.