summaryrefslogtreecommitdiff
path: root/serve/index.html
diff options
context:
space:
mode:
authorprospanclaudebot <[email protected]>2026-07-11 00:44:01 +0000
committerprospanclaudebot <[email protected]>2026-07-11 00:44:01 +0000
commit62478b97d2ead1458d76d5a814e67884296147cc (patch)
tree65bf5c2353d8ee85c30004384b21554aec033be3 /serve/index.html
parent9e8c39ca212e7983625181802e6303231fb2551b (diff)
downloadplaneta-zhopa-62478b97d2ead1458d76d5a814e67884296147cc.tar.gz
planeta-zhopa-62478b97d2ead1458d76d5a814e67884296147cc.zip
perf: 🌭 терреин-шейдер — шум 6->2-3 вызова/пиксель (переиспользую базовый), октавы 4->3, ВЧ-деталь только вблизи (бранч)
Diffstat (limited to 'serve/index.html')
-rw-r--r--serve/index.html18
1 files changed, 9 insertions, 9 deletions
diff --git a/serve/index.html b/serve/index.html
index edeed02..b47a7ce 100644
--- a/serve/index.html
+++ b/serve/index.html
@@ -1267,17 +1267,17 @@ terrainMat.onBeforeCompile = (sh) => {
.replace('#include <common>', '#include <common>\nvarying vec3 vWPosT;\n' +
'float h21T(vec2 p){ return fract(sin(dot(p,vec2(127.1,311.7)))*43758.5453); }\n' +
'float vnT(vec2 p){ vec2 i=floor(p),f=fract(p); f=f*f*(3.0-2.0*f); return mix(mix(h21T(i),h21T(i+vec2(1.0,0.0)),f.x),mix(h21T(i+vec2(0.0,1.0)),h21T(i+vec2(1.0,1.0)),f.x),f.y); }\n' +
- 'float fbmT(vec2 p){ float a=0.5,s=0.0; for(int i=0;i<4;i++){ s+=a*vnT(p); p=p*2.03+17.1; a*=0.5; } return s; }\nfloat WY=' + WATER_Y.toFixed(2) + ';\n')
+ 'float fbmT(vec2 p){ float a=0.5,s=0.0; for(int i=0;i<3;i++){ s+=a*vnT(p); p=p*2.03+17.1; a*=0.5; } return s; }\nfloat WY=' + WATER_Y.toFixed(2) + ';\n')
.replace('#include <color_fragment>', '#include <color_fragment>\n' +
- ' float sand = smoothstep(WY + 7.0, WY - 3.0, vWPosT.y);' + // песок у берега и под водой
- ' diffuseColor.rgb = mix(diffuseColor.rgb, vec3(0.93, 0.85, 0.62), sand);' +
- ' diffuseColor.rgb *= 0.88 + 0.20 * fbmT(vWPosT.xz * 0.3);' + // общий детейл
- ' float ero = 1.0 - abs(2.0 * fbmT(vWPosT.xz * 0.55) - 1.0);' + // ридж-эрозия
- ' diffuseColor.rgb *= 1.0 - 0.30 * ero * ero;' + // затемнить промоины
- ' float _nr=1.0-smoothstep(45.0,200.0,length(vViewPosition)); diffuseColor.rgb *= 1.0 + (fbmT(vWPosT.xz*2.4)-0.5)*0.5*_nr;') // чёткая мелкая деталь у камеры (анти-мыло, без глубоких нормалей)
- .replace('#include <roughnessmap_fragment>', '#include <roughnessmap_fragment>\n roughnessFactor *= 0.5 + 0.65*fbmT(vWPosT.xz*0.16);')
+ ' float _dst=length(vViewPosition); float _nr=1.0-smoothstep(45.0,200.0,_dst); float _nn=1.0-smoothstep(45.0,170.0,_dst);' + // дистанции — один раз
+ ' float nB=fbmT(vWPosT.xz*0.3);' + // базовый шум: цвет + эрозия + roughness
+ ' float nHi=0.5; if(_nr>0.02) nHi=fbmT(vWPosT.xz*2.0);' + // мелкая деталь только вблизи (бранч)
+ ' float sand=smoothstep(WY+7.0, WY-3.0, vWPosT.y); diffuseColor.rgb=mix(diffuseColor.rgb, vec3(0.93,0.85,0.62), sand);' +
+ ' float ero=1.0-abs(2.0*nB-1.0);' +
+ ' diffuseColor.rgb *= (0.88+0.20*nB) * (1.0-0.28*ero*ero) * (1.0+(nHi-0.5)*0.5*_nr);') // цвет+эрозия+мелочь из переиспользованного шума
+ .replace('#include <roughnessmap_fragment>', '#include <roughnessmap_fragment>\n roughnessFactor *= 0.55 + 0.5*nB;')
.replace('#include <normal_fragment_maps>', '#include <normal_fragment_maps>\n' +
- ' { float _nn=1.0-smoothstep(45.0,170.0,length(vViewPosition)); float hh=fbmT(vWPosT.xz*0.15)+fbmT(vWPosT.xz*1.3)*0.18*_nn; vec2 dH=vec2(dFdx(hh),dFdy(hh))*3.0;' +
+ ' { float hh=fbmT(vWPosT.xz*0.15)+nHi*0.18*_nn; vec2 dH=vec2(dFdx(hh),dFdy(hh))*3.0;' +
' vec3 Sx=dFdx(-vViewPosition), Sy=dFdy(-vViewPosition);' +
' vec3 R1=cross(Sy,normal), R2=cross(normal,Sx); float det=dot(Sx,R1);' +
' vec3 grad=sign(det)*(dH.x*R1+dH.y*R2); normal=normalize(abs(det)*normal-grad); }');