From 0eee6ad4a045aef63f282bfb4e7ac73219e32d55 Mon Sep 17 00:00:00 2001 From: Kelsi Date: Fri, 31 Jul 2026 07:54:55 -0700 Subject: [PATCH] fix(water): stabilise the shoreline masks, and add edge foam and spray MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The hard tile-like edges came from the depth the shoreline masks were built on. verticalDepth is sampled through the refraction offset, which wanders with the wave normal, and close to the beach that sample lands on dry ground — so the depth it reports collapses to nothing along wandering lines and every threshold keyed on it stepped hard. The masks now use a depth sampled straight down the pixel; the refraction colour keeps the offset sample, which is the only place it belongs. Foam was also being removed exactly where it should be strongest: a smoothstep zeroed it below 0.1 of depth, which is the waterline itself. That ramp now runs to 0.025, enough to keep the water mesh's own boundary from reading as a hard line and no more. The wet band's alpha gets the same short ramp for the same reason. And there was no spray. A sparse, much finer field now throws off the front while it is advancing, which is what distinguishes breaking water from a wet line. --- assets/shaders/water.frag.glsl | 38 ++++++++++++++++++++++++++------- assets/shaders/water.frag.spv | Bin 41520 -> 42984 bytes 2 files changed, 30 insertions(+), 8 deletions(-) diff --git a/assets/shaders/water.frag.glsl b/assets/shaders/water.frag.glsl index a4643641..b687c57f 100644 --- a/assets/shaders/water.frag.glsl +++ b/assets/shaders/water.frag.glsl @@ -271,6 +271,15 @@ void main() { float verticalFactor = abs(viewDir.z); // 1.0 looking straight down, ~0 at grazing float verticalDepth = depthDiff * max(verticalFactor, 0.05); + // Shoreline masks use depth sampled straight down the pixel rather than + // through the refraction offset. The refracted sample wanders with the wave + // normal, and near the beach it lands on dry ground, so the depth it reports + // collapses to nothing along wandering lines — which is where the foam and + // wet sand were picking up hard tile-like edges. The refraction colour still + // uses the offset sample; only the masks need a depth that stays put. + float shoreLinDepth = linearizeDepth(texture(SceneDepth, screenUV).r, near, far); + float shoreDepth = max(shoreLinDepth - waterLinDepth, 0.0) * max(verticalFactor, 0.05); + // ============================================================ // Beer-Lambert absorption // ============================================================ @@ -336,14 +345,14 @@ void main() { float swashPhase = sin(time * 0.55 + noiseValue(FragPos.xy * 0.12) * 6.28); float swashDepth = 0.30 + 0.18 * swashPhase; - float wetBand = 1.0 - smoothstep(0.0, 0.70, verticalDepth); - float shallowBand = 1.0 - smoothstep(0.0, 2.20, verticalDepth); + float wetBand = 1.0 - smoothstep(0.0, 0.70, shoreDepth); + float shallowBand = 1.0 - smoothstep(0.0, 2.20, shoreDepth); // How thoroughly the surf currently covers this point. Sand deeper than the // front is under the run-up and soaked; sand shallower has just been // uncovered and is draining, so it lightens as the water pulls back. Keying // the darkening on depth alone left the wet zone fixed while the water // visibly moved over it. - float coveredness = smoothstep(swashDepth - 0.12, swashDepth + 0.08, verticalDepth); + float coveredness = smoothstep(swashDepth - 0.12, swashDepth + 0.08, shoreDepth); if (basicType < 1.5 && shallowBand > 0.001) { float sediment = noiseValue(FragPos.xy * 1.6 + time * vec2(0.10, 0.06)) * 0.6 + noiseValue(FragPos.xy * 3.4 - time * vec2(0.07, 0.13)) * 0.4; @@ -429,8 +438,8 @@ void main() { // Only on terrain water (waveAmp > 0); WMO water (canals, indoor) // has waveAmp == 0 and should not show shoreline interaction. // ============================================================ - if (basicType < 1.5 && verticalDepth > 0.01 && push.waveAmp > 0.0) { - float foamDepthMask = 1.0 - smoothstep(0.0, 1.8, verticalDepth); + if (basicType < 1.5 && shoreDepth > 0.001 && push.waveAmp > 0.0) { + float foamDepthMask = 1.0 - smoothstep(0.0, 1.8, shoreDepth); // Foam rides on the water rather than sitting in world space. The surf // carries it up the beach and drags it back, so the whole pattern is @@ -478,11 +487,24 @@ void main() { // The surf line itself, on the contour computed above with the wet sand, // so the foam sits exactly where the water currently reaches. - float swashBand = 1.0 - smoothstep(0.0, 0.17, abs(verticalDepth - swashDepth)); + float swashBand = 1.0 - smoothstep(0.0, 0.17, abs(shoreDepth - swashDepth)); float swashTexture = 0.55 + 0.45 * cellularFoam(rot1 * foamUV * 8.6 + time * vec2(0.05, 0.12)); foam += swashBand * swashTexture * 0.55 * foamDepthMask; - foam *= smoothstep(0.0, 0.1, verticalDepth); + // Spray thrown off the front as it runs up: much finer than the foam, + // sparse, and only while the surf is advancing. It is what sells the + // edge as breaking water rather than a wet line. + float sprayMask = 1.0 - smoothstep(0.0, 0.11, abs(shoreDepth - swashDepth + 0.04)); + float sprayCells = cellularFoam(rot2 * (foamUV + swashAdvect * 0.5) * 96.0 + + time * vec2(0.6, -0.45)); + float spray = (1.0 - smoothstep(0.0, 0.035, sprayCells)) + * sprayMask * max(swashPhase, 0.0) * 0.7; + foam += spray * foamDepthMask; + + // Only enough of a ramp to keep the water mesh's own boundary from + // showing as a hard line. The old 0.1 cut removed the foam exactly where + // the water meets the sand, which is where it belongs. + foam *= smoothstep(0.0, 0.025, shoreDepth); foam = clamp(foam, 0.0, 0.85); // Bluer foam tint instead of near-white color = mix(color, vec3(0.78, 0.85, 0.92), foam * 0.75); @@ -514,7 +536,7 @@ void main() { // Wet sand is a band on the beach, not a film of water, so it needs enough // presence to darken what is under it; foam has to be close to opaque or it // does not read at all. - alpha = max(alpha, wetBand * 0.42); + alpha = max(alpha, wetBand * 0.42 * smoothstep(0.0, 0.05, shoreDepth)); alpha = max(alpha, shorelineFoam * 0.90); // Dissolve the sheet before the water geometry runs out, so the ocean fades // into the horizon haze instead of ending on a hard line. This has to come diff --git a/assets/shaders/water.frag.spv b/assets/shaders/water.frag.spv index ad8b0b793fee6925e25ae582a795d12c6aeb3f10..fb874797a79259defd43901421a149e38d7ee3d1 100644 GIT binary patch literal 42984 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 GwEqLpUeurf literal 41520 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

le+|Sn`Q=CbF^W zJ?&TM;x*Q_=!qqtab1TjS7S|Sw#JfAtREm7tKQRojV@ke-GrW4@`-gbvRsYzn`Ub) z`P_fbLw3zPQpe{vTkmPky>p^n_=$yg4EmOj&kK?DX>RE=sp38t%743rEfh^v;Cwku@??e|*)4yZB3rzpU_Z@H=y0-4+ykB|Fd*Zs-Xy-ed zeck87sT=?9^&WKp?zO%H-U}w4-2Q+p=6}y4*Q5u~&B1HZbec99|MbS0pZ&D;-`0)4 z$I!KTloo%FBUgXg#NVG9r$75?>)(ZD3{RjthNWnEkNq>4cw+tqSwG_O`xLS>ufM=K_AeqELwoybllcE=oOSXN^51Fx zO>q3Zf^L89^55Bd75U#d{D^if{W9Lyz~yp%ejQm%f9d-cditJM`u+=CE`8rdwy${p zJ)?J!^(mM9-$l;+$$Ou$7F-wqo$mL*j5i6{Jl{ipA51*|?$rm#Vm1%`Va|P_cMp67 zZk#k@y9Yi7)7F~Mhc&Kk_U)(0+IR%}tYP*G_Ibm4WA^?Va9@DgUwe7iA^*KbIrmxq NdySqyBa<~~{|j`g<(U8g