diff options
Diffstat (limited to 'serve/index.html')
| -rw-r--r-- | serve/index.html | 18 |
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); }'); |
