From 031137a5facd54c0e3e68326acbec0168250dcac Mon Sep 17 00:00:00 2001 From: Orkuncakilkaya Date: Sat, 19 Sep 2026 19:43:29 +0300 Subject: [PATCH] feat(render3d): rain that leaves something behind Rain fell and the ground did not change: the weather was a curtain of particles in front of a dry valley. u_wet, 0 dry to 1 soaked, does the three things a wet surface does. Darkens the albedo. Drops the roughness hard - which is what makes a soaked meadow read as soaked rather than merely dark, because the sky glances off it. And pools: water finds the low places and flat ground holds what a slope sheds, so the puddle mask is the macro noise the materials already use gated on slope, and a puddle takes the world's up for its normal rather than the ground's relief. It joins the shore's existing wet band rather than fighting it - the same term from a different cause. 34.1% of the frame changes between dry and soaked. GL 7.1 s either way over 400 frames. Co-Authored-By: Claude Opus 5 --- changes/rain-that-leaves-something.md | 20 ++++ .../shaders/spv/1f95f31b.frag.spv | Bin 88864 -> 90268 bytes .../shaders/spv/2e2908c8.frag.spv | Bin 90764 -> 92168 bytes .../shaders/spv/5e4589a1.frag.spv | Bin 103528 -> 104932 bytes .../shaders/spv/a0f2dbac.frag.spv | Bin 103528 -> 104932 bytes .../shaders/spv/f2952361.frag.spv | Bin 105396 -> 106800 bytes .../shaders/spv/f4382918.frag.spv | Bin 88864 -> 90268 bytes .../ludic.render3d/shaders/spv/manifest.txt | 90 ++++++++++-------- packages/ludic.render3d/shaders/terrain.frag | 27 ++++++ packages/ludic.render3d/terrain.ludic | 3 + 10 files changed, 98 insertions(+), 42 deletions(-) create mode 100644 changes/rain-that-leaves-something.md diff --git a/changes/rain-that-leaves-something.md b/changes/rain-that-leaves-something.md new file mode 100644 index 00000000..d301a658 --- /dev/null +++ b/changes/rain-that-leaves-something.md @@ -0,0 +1,20 @@ +bump: minor +type: feat +Rain that leaves something behind. + +Rain fell and the ground did not change: the weather was a curtain of particles in front +of a dry valley, and a shower was something you waited out rather than something that +happened to the place. + +One scalar, u_wet, 0 dry to 1 soaked, doing the three things a wet surface does. It +darkens the albedo. It drops the roughness hard, which is what makes a soaked meadow read +as SOAKED rather than merely dark - the sky glances off it. And it pools: a wet ground +does not darken evenly, water finds the low places and the flat ground holds what a slope +sheds, so the puddle mask is the macro noise the materials already use gated on slope, +and a puddle takes the world's up for its normal rather than the ground's relief. + +It joins the shore's existing wet band rather than fighting it - the same term, from a +different cause. + +Measured: 34.1% of the frame changes between dry and soaked, and no cost - GL 7.1 s +either way over 400 frames. diff --git a/packages/ludic.render3d/shaders/spv/1f95f31b.frag.spv b/packages/ludic.render3d/shaders/spv/1f95f31b.frag.spv index 5fa89feedb9ec892277921e84e83af3ddc4caa06..748e52781299e32a5761628a63b56235f6e2fa77 100644 GIT binary patch delta 10332 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 delta 8865 zcmZ9R3w&KwmB#nYqivuGZ33-4TA@X3Nm|+pl~_|~36y7PrGQ1ocrj@j&C4XEJ~`tc z4uc9Zaf}KIqT(CHh@vy&49+0)fMI}nporpIp&%kcsTBSH?>(zM+{7bUB&boD=sdeUzw7f2*C6ga$ zoxf~pN@+*WVEN5`Db3(NEyq^0k+FgPfngwOV?}SDysx$G(2k0ATY0Q!d~|SNVqdRi z(|cP#GcRjMkIznN+rZ$ET^srDN%;8ok+HrD%M*QLY7OaWw9)cdStor;B)GFYzI_8O z)qV}B8EvpUx+VBR`2Ic(>Bt)Xa`?8aw{OB84zjYw;T1Lf_!@qq0fq*8qyPFEdv^^# zwT7PopRuj4x4&=8H4l3e%Xt7eYy%>9vdQ7 zefk)2BYylJpJTpp`*x)Z_0G{A%4@<`S3A@JD9j{fa= zVn2ot^-YuqbN&c?e0#ZfWT*a(=_l|VJ>xrubFq>2cX#y<_MA3W?muN@WUQC2j+3Rw zFuZYO5Ymu#fs3p6L=AtkhCfxqpRVE0)bQOkd{1-s;sIa4q4$#ho@x~uQfjI4^57+v znbqff|7;slW3COAC!A4ghL7fz@qW6rXXoh1c(tmB!8hi%!}ZJd?eB)P5Mg|9WYo=V zH5S2p2gWC$mBE+5FCFOH+1)ofQC*7qbOKsb@0H+U^*U?#ni}2(&x##Rs&QCX!%wN< zr`GTdHT*32NDt|axW5|G*)Os;rq{NlRyRt%b*i)6I^DVa;rjUv)zhRh^^{Jhzo$<7 zs|9UYu6=#_idD~+GPmVXNONc#NJqX1>`(3%JrI0Q&Rx8P z8u@8=Iz>+Um3Uk#c6l-0*4*A&wb!Ms(|eC!Ijgi{^0=aI}*EFZqY1_7A_6cvs;o@u7pA-WR!Y3I}-4^YN9^_?kLu-k5kwr!DYL9gvdxp{XgIKl#yf7O%Vj zc0SFh7jpHd<`m^_NPlu`ymj*NbJ{b{Cu6EE=IWUgd=}huDR>9mW2wkJmWteCDY)@G zl8W48slYEto=YJ(fag+?doC5Z$5QYI@b_2>?tmUkGbfuj&d-eIAyl+_=*YX6uIo7m z?pm(Rk81fk%52}cV9PVeLhJ8-Xoaim)5&rk3|_(2^$(vz!01`J9Vgd%9)cY;Jj*~Y z;p%S>LAA}NsqJQ$h@WR`iPa2h!bgA;Yi^>hiM*5ePGSN0GOp^{UBd+}J^N?!QUt}~ zOpb)BUrrEbb`*FyGgUW;3#}HFS`4-t&U_U!K6n!`aD2;!DQR#*Spj+eFR)PjL0#w4e4E zTwBCH2b>Si>j7_L3bD&Kf{!7Hw{Wb=xnOmFp>4{w;ttrHYsDS#8Z`UsuiYJBQl7rr z_D+}2yX&^hZ9Q|nGIwPl*(ws{OZhjumHyxn$z)gGm}qqV8Ut@;G`VOoUz zE!ewdCG9bQZ*2P5*X^%e>{h>#RJbFv%0PcWIDt+Y%-O-80sA(pEfRVbtiFY2Anzfy zn80qZNd|u|=h1%;Ty31hsy>_ze?&0QCd%T#&x3!)J7zRzr@j~6*)69T$bR}pHC_Na z%ZT$Quv)Z;lUS{Yvpd7Vz&b~Xb%>z#;9`jz^3ImncXCUtPx#LO&q0eNnOX3Eh)Mb0 zu21ZYY!<|zI+}pTj#>n40;_$SW$_*40I=HkSU=xEW`q6t4x;Tqnwsw&;)v4%b|Uf2 zI|z=pa9<{K5EQ?QQ@j<;om#oM)V8@5c`hxIJ{YX#M@PJN90E3kHpg_u=7F0j#<|=b z-XHVfYV)S<*jQ>i@eg*X))sAV6`1}u5b12`3ShW?cKSy0Bl%o zW?{u%3T`C}tLvdH7kgmq-^sr7hCB-VQ?B@A6=Mv(2tx+}bZ{V@7lWO$ws=1}8jPFU zr(%!(FGFz0YmffN$6LLvCpk(zL|VUpfqnvCm=jXKs)HD zLnN~rtlfGc5dm+>=$aX_C)|1ZEZ>iMAM8ZloFb|*)S9&jEbOE>U`x6SMm zog&B^z_$`a#|Tmen`{KR1RROff$t(2eImvi!N$=qwp1_J1hrNDc+m7goVCUnY#Z49 z7Qy<#zv4Vnk6_!uCa*302EfMC=E`s7s%G3pRP0UQcoJIep$tK%nAI@YS+#2fcSC%0 zji=WLnm*C&XW-GipHD#t8KmiJ5)P>SInMrg26)w$`P%0oG4nC_U-A%%2g^8IEgmd8 z!2W!&Xq%v^`Ct*pOfLl&x8zQ^n#~`p<@>|by&Fr7*;^5HIGewU#SQp2c$bOM;s$&> zn!Xhq33!gb6CO9h_Aajai!bAPCCiteMail^Oke%+t4o(n4ZWr`f9iDZK6>zl`+yMEQS$Z#mfn(6W z2CLn~3}PQ#30IF6``~ZTC|Kof$iW>zUz0Tv?UCI3z#k!*nC$!EyPCKoBD)VD=%gV! zT@Aiqf41ow_|+s9eLg6ssk>~>`dYBDv_+i11%I+I_$2&#<79cK4jit@XT*Xz*n3)-04{4!}>qw>p{_&ij?}o(5d-oG) z>M`>h!1hy*zn9zyzK*8N_W@&n66_M4O4DuvALFV{?CPucrywQ}v-~t%r`bG+4DuPU zLAq)BYB$hLT(w2N&w@W(sLto$y9(9$JX|03Y9H4B3y>{^HU1*JxW-?C>!The{W92K z+G6lqz@IG){uOv}X}${AM?K=)>g{JRjUi5hZ>4>W7G?Z8ILfHq+271nJrei^*s8@c zeiN)uaT#xitH&~C--6gtLj?LZ*wRLzzXuzr_!qZ-fU8HKe+1i4Jtp!Uu<^A;?0*6m z_F9(y8NuN5>Z(p|wmabJ5&XMgJE}+Ue*rsywy4s-f}={>tp zLt)+i4eq_EgUS3m{74RyIH3LmuI3}y4XV$7!X0=C&Hnnt;dM7yd$c&b?m;Ute&zHs zD-+Q9|q|DW4UR^LcgJ@(P}!B^1=8!}5jK+s@^2f50l!wmWS=PVAosQ6I|tC`yJS)p0+2!a&1=W_h74`?J2HuZI%BY_XmjO(fBl1d31ah z?6PQkhO0bm&w))|+itG%u>BD{H=o2Fu)LE+TSPL?gNL~?xvVk^vo$LRcMyZw$-s|s zwS$4}{3mc!;03TeY^9d{6-Z!tB-8+oWb485t~6XN&kRWMo}UT#!4aKj!9C04E@^_> ZM?Y;Q+Q?Nsk~siu@-MIh#3!_x0wt0(I0KB%LNf!TrB^e}a!ZC7 zbHgR~&}cGuGuKMYElumSx3}IFb19c{Lwmp9`@auf?%&Vx{C>aZInUY8xpTPS(Yo`V zt{YfWJz|R_sY?1MeUsl_GVr*5I}J*b!%0u9Z|*l_pSq;JI!Q()NwR$5%BC*zKK!S) zXQp*FH7smtTG7;kTJas-eaVoaUvoqsW1F%drgVgmiQp};^r3J@vlp^ zhIcM)?`ZmbLswHrCC0YJGP7|Sjm zSMeJMS9`Fa)#utHz0>x2w<>k3?}lWk!>LX_9PCf-w(k$#D(7y9T{QC3Zhwp1{uz%f zv&)O|Udru5D)#E+rQW;uozS;xLiekaZ|>f8N^S4zDKFM;?HxFV@Y|4|P1i^Fo_@&L zeN*Wx++1Fpn){G{3{R5trUf6uVfW;QnUjMLh2OPH-ITF-+mdbI`kYTWZQ(ZpeB0p- zQ-Y6#GYy;Ke%90W$qgH(hQm>r!ygU`z5u>>@yJd50{DW951twoUkLA}Qgu`4_kruH zl4N?GLVpfDw6=aWwEOon`=oCnC&{owqT07J-Y|U<<8dVxXVBlS@EyTKO;(e%%big* z?fZfqL&rtC+#^&i_yIZB|G+`qFB-!EA@NKNZUE0yxdjdbTUk^fcL}N40Vnh*xJxW} z1AHvp@{78kIeKW?hEiYf=zx!d@5yQXEcsXAqjP)-*pj~_XW4J+y4=O87DM+Oe8I)l z%urq8e)={1x-FALeTSr9@;o^`=|1V0ohQ5imK*ywW%@a;XgVpcC z$8B*8*n;ZsQqe4Oe;*K3+p#3I_mb)iZ)97F)r@I_=YSKogbhtytqK#Vz+TJ+pFys! zgR5IDdh&U&TCpczfUBQP410Dw*watl814YI7^xG$js`K)WN&)B0AkPIuldC3i)iWw zwP7cMEvP<#YOH7>n0m4=Y3)`vpIqGrFCssQWNeQh8!!sonCp|1v@&;12)4+-Xbij< ztmZGYCAnsWp)JidVkWZ~To2`DG|TI+-I2J2xY|yJTe&`24Ax(A3PgiJ(tL5Wz}4-M z-3n?={%APP;Bhs*iQ#L+B7!J4m^c0x+7d*_Qb|)a9 zK`0N~*nA5DF7%=ZNlhdZ{=gmP zik0LKtrVNAIo&%fogPIC^&@SZ<7)$&0ZpN@#Wu`soJ4#dJV zFP;mh!flkX9s!?5vh2g;@@)TWd<+t6;8CzVdh>Izy|Liqi$A|I@cVL(4NV)YP7fkpGC90{@T3(ZPXKB zZ67hF2axtl>UyWnzyFTZSIqdd@^i_T%;0{j`H~sjPi$W@gKrD>B{R6?eaQ^&rUNH+o_JSGQ2Ka&*+y?l98QcnI^t?W}>Znv#pDe?qt524}ZL3d~!7b{O zWpK-P7P#eovJAWBeXgK3Rr?0e!LzZa|+bgB#E%%is={PnJdQvt^O{ zbXnv+UsgCDQwHD-b2A5@Fr$Di_8GIteabBI?N}m3zI}lke?*Dz9=w^Iro+e(az3iS zZNTUfA6w$}B|g5y_a1cTRYR(7o0P`6_4fglbIW&(*tM^M)d$cQ&!E@9Zk$o1zk#*8 zDgI2ZEy}$PRy!yE@OlHR_6}d{ai0AHPOLOLm)u>QBpqYB{}VizbP++^;ctS~ENG?L z)WmK+-z1_lZ^J!=i=BA~O+CK+{sn$#0GC()+RC@cy9oaL7SZ@`lA5=*IC}R!cq=N4 zo_qj@W+(Go02`u@4f7Px9-aCSJP`Y_jHv5lV_yWt4}0D`sA_2X5pW~PIJ4-uKL3IH znq>0EP)k^E`f4+_pR(0xLnvpxo;Gr^CyoAMPnq+0wDIh9M(f}&lIxEjpK^ehwmx7T zoSC?)wt%av#Q^k$L$d++6Ty8=(k}+AAJ~D2xLd+4qaHKXA3VOA*(grg07MN@a3I*i z>h{KISM$1xnKF-xx5D-^JQ_L}9u0jJ;7sXbEYI7)X-+&`uV%5vUzEe(`_e;o8{>N1 z4(y|ywpgRvgVpCysX;xo)nfX00K0C3e=6rue&mh_iVkl$?F2W_EN0A#cOKYt(Xmy- z(p}K(O+CqS`t3}L-hUcwucF+pV6{k&it%>BH?hejJG|d*!9talp zvt$I=A=N1gd4s)lYm5vX)ALlm_i*mKQnj)+Of z2a=-3&weI|g6PaU=iG#s^B*!Ps zj8XX^7{)TaI#`j;)4_IGTfA}{3U-;0W%ek47=mkEdz3#s*RhQd!vxvgDJuD^H% zdEsJ9la&Y#g#~ofAsX`)u=e6moC;Tup*R_=W+PnHUj+{@@UMX#t~l6E2Q!MiT!?+t814He*xeDq&IA9I6G=USeG6>kwT0ie z!N$|(%bYH)336-@&d=B+D82lDwQ( zqLo}o($_{

{tO;zBUjw#s3jP6g5PZuptpDDknl8m<<%%o?yiZy9ahC8>GKh@+=H z;Nk|l6s~6S$82RE4{PRB)u!J=)L|z7vKYt3W$?*1j1kz#G! zf@X(Y8&+<7eQm4_xy3aQt@{D^QW_H#uYBUE zol1NCBe1cwW$)OEy^w1PmH!xiMIq1~aDCJx&`-by(-sZ76MR!4&Ry_zg*bP^^-(9z zep!p|ff!7qLvt&+S_HixJcx0eMi0i)*av#1oxoSgPmv!W#Q;4B)>S?J`QvBc`$*dS zFtD!=ft{5@N!qRQUUK!Q@)59A27eT;kAIdL<1yE+L8g;**1)G`u()&%pIjk2ueQ zjioKLUxU@3BgH5_@7j%F)WP0APX0V88t@yi!xl65B3Pff`Otb2zXVs0Y5XnNa_SN1 zcVI_0;`}!_HBj;2(_V&ah(NywTTnfE@;_iJ&=$e}04^@C|AiZSSarq6M*b159V?IFnvQ zQ1m9=^l$>VVjoTnpii7vuY+GJq&TnMK(mbJm5s6?`o^69Be%PA-f;fy&0okhMC<_c^ohp)8>~;HXl(i}Vzkyutw`r+?R&Z1*6JIL zRgZ=A0odcFxFA1-tLy(hxjg(o0_)GZOE=BO#|RqY9{Ug2hWRO>%@5Fe1Osk_Ymd21 z2J!k*;8pPAJ61JZ&A-YbevKOSXY*u$bu1PgqXHeGf?BYT7V%k82Um+Hs4c+${H)N{ zhot6bg*f8$1s5CIFGVnLv}#LuOoz_f(5Qao(J1Y)Ci;V8jkqQTz>O6PdLUe_c*zce zt4B&>A#8;h6&u)B6rE!o49@MY1AT3fm8(aCwgwkJ4Tj`A_WMw{nxCEdh@{Cj2(~&_ z>b7vTNYTJyXwg6`GMK(L#7edM%@V_IuFV(S=@hiWD`@S*> zn#rG)w&8q39ZxW5+8g1Qqwfkf;6iRR|BZb&u$q3X*CeHI{AIg$z7` z+yVx+@c!T!f&IYpuuTNV2pj;GM}s~Gj>b*`%fmKh(BjQ6g{c_*un32P;NJDIIH$p< ako41LLno7~M`I2K+xU-J0b>8P>Hh(CAzlOk delta 10794 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 diff --git a/packages/ludic.render3d/shaders/spv/5e4589a1.frag.spv b/packages/ludic.render3d/shaders/spv/5e4589a1.frag.spv index 6e67a36a280a0e99c63bcd232e3a69548a439575..e164e783c1c973573d33dcbeb9c8aba965b895e4 100644 GIT binary patch delta 10324 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 delta 8908 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 F@&DfNDue(4 diff --git a/packages/ludic.render3d/shaders/spv/a0f2dbac.frag.spv b/packages/ludic.render3d/shaders/spv/a0f2dbac.frag.spv index 951bd89b97f475475332149e5fa06f30bb7225cb..20f97ef8087ed21d7ad7302004c3423ac1f6f5da 100644 GIT binary patch delta 10324 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 delta 8908 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 F{{h!lg;@Xq delta 10692 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 OZ1V5$MkM|yTk&7X1P-|X diff --git a/packages/ludic.render3d/shaders/spv/f4382918.frag.spv b/packages/ludic.render3d/shaders/spv/f4382918.frag.spv index c226f79f765b98a8a8ef815d3bedf93c3209be4a..b3f353d082999385696bc4796d8a1da37734f2cc 100644 GIT binary patch delta 10332 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 delta 8865 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 ZM?Y;Q+Q?Nsk~siu@-MIh#3!0 on land, metres // wet ground: darker and glossier near the water, fading out over ~1.2 m float wet = smoothstep(1.2, 0.0, above); + // the rain's wetness joins the shore's: the same term, from a different cause + wet = max(wet, u_wet); alb *= mix(1.0, 0.5, wet * 0.85); + // Puddles. A soaked ground does not darken evenly - water finds the low places, and the flat + // ground holds it while a slope sheds it. The noise is the same macro field the materials + // already use, so a puddle sits where the ground is genuinely dished rather than in a + // pattern of its own. + float pud = 0.0; + if (u_wet > 0.01) { + float lowness = smoothstep(0.35, 0.0, slope); + pud = smoothstep(0.45, 0.72, fbmC(cheap, p.xz * 0.35 + 17.0, 2) * 0.5 + 0.5) * lowness * u_wet; + } // A sheet of water actually runs up the bank ahead of the foam, so the ground inside // the wash is seen through water, not bare. Without this the gaps between the foam // streaks showed dry grass and the wash looked like white paint on a lawn. @@ -477,6 +495,15 @@ vec3 groundShade(vec3 p, vec3 N, float slope, float dist, float viewDepth, bool n = normalize(mix(n, N, smoothstep(150.0, 900.0, dist))); float ao = arm.r; float rough = clamp(arm.g, 0.3, 1.0); + // Wet ground is SMOOTH. That is what makes a soaked meadow read as soaked rather than as + // dark: the sky glances off it. A puddle is smoother still and flat, so its normal is the + // world's up rather than the ground's relief. + rough = mix(rough, 0.28, wet * 0.8); + if (pud > 0.01) { + rough = mix(rough, 0.06, pud); + n = normalize(mix(n, vec3(0.0, 1.0, 0.0), pud * 0.9)); + alb = mix(alb, alb * 0.55, pud); + } float metal = 0.0; // the shadow map carries the objects standing on the ground (trees, rocks); the // ground's own relief is in the baked height-field shadow that sunShadow() applies diff --git a/packages/ludic.render3d/terrain.ludic b/packages/ludic.render3d/terrain.ludic index cac569ee..b1446f4b 100644 --- a/packages/ludic.render3d/terrain.ludic +++ b/packages/ludic.render3d/terrain.ludic @@ -45,6 +45,8 @@ var ter_smooth: bool = false # generate the analytic test ground instead of a var ter_far_split: int = 0 # metres: beyond this the terrain takes its cheap far path (R3D_TFAR) var ter_far_band: int = 0 # half-width of the near/far blend (R3D_TBAND) var ter_snow_line: int = 0 +# 0 dry .. 1 soaked. The game sets it from the weather and lets it dry out. +var ter_wet: int = 0 var ter_tex: words = null # 11 material textures (see terrain_bind) var ter_ox: int = 0 # world x/z of the terrain centre (float bits) var ter_oz: int = 0 @@ -483,6 +485,7 @@ function terrain_bind_prog(p: int) -> void { u_f(gpu_uniform(p, "u_half"), fi(TERRAIN_HALF)) u_f(gpu_uniform(p, "u_texel"), fr(1, TERRAIN_RES)) u_f(gpu_uniform(p, "u_snow_line"), ter_snow_line) + u_f(gpu_uniform(p, "u_wet"), ter_wet) var lake = fl(-100000.0) if ter_lake_ex != 0 { lake = ter_lake_level } u_f(gpu_uniform(p, "u_lake_level"), lake)