← 每日 shader~/adventure-log/shaders/2026-09-24

向北,丘陵奔涌

向北,丘陵奔涌细雨里层层秋丘向后飞掠,云隙漏下暖金色的光。 · 毛毛雨 19–29°C
源码parallax layered value-noise hills with fbm clouds and sun rays
2026-09-24.frag
precision mediump float;
uniform vec2 u_resolution;
uniform float u_time;

float h1(float n){return fract(sin(n*12.9898)*43758.5453);}
float h2(vec2 p){return fract(sin(dot(p,vec2(127.1,311.7)))*43758.5453);}
float n1(float x){
  float i=floor(x);float f=fract(x);f=f*f*(3.0-2.0*f);
  return mix(h1(i),h1(i+1.0),f);
}
float n2(vec2 p){
  vec2 i=floor(p);vec2 f=fract(p);f=f*f*(3.0-2.0*f);
  float a=h2(i);float b=h2(i+vec2(1.0,0.0));
  float c=h2(i+vec2(0.0,1.0));float d=h2(i+vec2(1.0,1.0));
  return mix(mix(a,b,f.x),mix(c,d,f.x),f.y);
}
float fbm(vec2 p){
  float v=0.0;float a=0.5;
  for(int i=0;i<4;i++){v+=a*n2(p);p=p*2.03+vec2(1.7,9.2);a*=0.5;}
  return v;
}

void main(){
  vec2 uv=gl_FragCoord.xy/u_resolution;
  float asp=u_resolution.x/u_resolution.y;
  vec2 p=vec2(uv.x*asp,uv.y);
  float t=u_time;

  vec2 sun=vec2(0.72*asp,0.70);
  vec3 sky=mix(vec3(0.97,0.78,0.55),vec3(0.42,0.62,0.78),smoothstep(0.35,1.0,uv.y));
  vec2 dv=p-sun;
  float d=length(dv);
  sky+=vec3(1.0,0.72,0.40)*exp(-d*5.0)*0.45;
  float ray=n1(atan(dv.y,dv.x)*5.0+t*0.08);
  sky+=vec3(0.9,0.65,0.35)*ray*exp(-d*1.8)*0.18;

  float c=fbm(p*vec2(1.4,2.8)+vec2(t*0.035,0.0));
  float cm=smoothstep(0.52,0.78,c)*smoothstep(0.4,0.85,uv.y);
  vec3 cloudCol=mix(vec3(0.62,0.62,0.70),vec3(0.96,0.86,0.74),smoothstep(0.9,0.2,d));
  vec3 col=mix(sky,cloudCol,cm*0.75);

  vec3 farC=vec3(0.60,0.58,0.74);
  vec3 midC=vec3(0.86,0.55,0.34);
  vec3 nearC=vec3(0.42,0.20,0.16);
  for(int i=0;i<5;i++){
    float fi=float(i);
    float dep=fi/4.0;
    float spd=0.03+fi*fi*0.035;
    float base=0.52-fi*0.095;
    float amp=0.05+fi*0.02;
    float fr=2.6-fi*0.35;
    float x=p.x*fr+t*spd+fi*17.0;
    float y=base+amp*(n1(x)*0.72+n1(x*2.3+3.0)*0.28);
    vec3 lc=dep<0.5?mix(farC,midC,dep*2.0):mix(midC,nearC,(dep-0.5)*2.0);
    lc=mix(lc,sky,(1.0-dep)*0.45);
    float rim=smoothstep(0.035,0.0,y-p.y);
    lc+=vec3(0.30,0.18,0.06)*rim*(1.0-dep*0.5);
    lc*=0.85+0.15*smoothstep(y-0.25,y,p.y);
    float m=1.0-smoothstep(y-0.006,y,p.y);
    col=mix(col,lc,m);
    float mist=exp(-abs(p.y-(base-0.02))*18.0)*(1.0-dep)*0.18;
    col=mix(col,vec3(0.95,0.86,0.78),mist*(1.0-m*0.5));
  }

  vec2 q=vec2(p.x+p.y*0.18,p.y);
  float cx=floor(q.x*28.0);
  float on=step(0.55,h1(cx));
  float fx=abs(fract(q.x*28.0)-0.5);
  float ry=fract(q.y*2.5+t*(0.9+h1(cx+3.0)*0.4)+h1(cx+7.0)*10.0);
  float streak=smoothstep(0.22,0.08,fx)*smoothstep(0.0,0.1,ry)*smoothstep(0.35,0.1,ry);
  col=mix(col,vec3(0.92,0.93,0.97),streak*on*0.16);

  vec2 vc=uv-0.5;
  col*=1.0-dot(vc,vc)*0.55;
  col=clamp(col,0.04,0.95);
  gl_FragColor=vec4(col,1.0);
}