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

墨在雨里慢慢洇开

墨在雨里慢慢洇开整日的雨落进水盆,靛青、苔灰与铁锈色的墨环缓缓推开。 · 雨 20–22°C
源码suminagashi marbling rings via smooth-min drop fields with fbm-warped flow and soft vertical rain
2026-09-28.frag
precision mediump float;
uniform vec2 u_resolution;
uniform float u_time;

float hash(vec2 p){return fract(sin(dot(p,vec2(127.1,311.7)))*43758.5453);}
float noise(vec2 p){
  vec2 i=floor(p);vec2 f=fract(p);f=f*f*(3.0-2.0*f);
  return mix(mix(hash(i),hash(i+vec2(1.0,0.0)),f.x),mix(hash(i+vec2(0.0,1.0)),hash(i+vec2(1.0,1.0)),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*noise(p);p=p*2.03+vec2(1.7,9.2);a*=0.5;}
  return v;
}

void main(){
  vec2 uv=(gl_FragCoord.xy-0.5*u_resolution)/u_resolution.y;
  float t=u_time*0.05;
  vec2 w=uv;
  w+=0.14*vec2(fbm(uv*1.5+vec2(t,0.0))-0.5,fbm(uv*1.5+vec2(3.1,-t))-0.5);
  w.y+=0.04*sin(uv.x*3.0+t*2.0);
  float p=0.0;
  for(int i=0;i<5;i++){
    float fi=float(i);
    vec2 c=vec2(0.55*sin(fi*2.4+t*(0.6+0.1*fi)),0.33*cos(fi*1.9+t*0.5));
    p+=exp(-6.0*length(w-c));
  }
  float phase=-log(p)/6.0;
  float x=phase*28.0-u_time*0.4+(fbm(w*4.0+3.0)-0.5)*1.8;
  float band=floor((x+1.5708)/6.2832);
  float s=0.5+0.5*sin(x);
  float ink=smoothstep(0.3,0.75,s);
  float m=mod(band,3.0);
  vec3 indigo=vec3(0.20,0.27,0.40);
  vec3 moss=vec3(0.36,0.45,0.41);
  vec3 rust=vec3(0.60,0.38,0.26);
  vec3 inkc=m<0.5?indigo:(m<1.5?moss:rust);
  inkc*=0.9+0.2*fbm(w*3.0+band);
  vec3 paper=vec3(0.84,0.81,0.74)*(0.93+0.09*fbm(uv*6.0));
  vec3 col=mix(paper,inkc,ink*0.85);
  col*=1.0-0.22*dot(uv,uv);
  float cw=0.07;
  float cx=floor(uv.x/cw);
  float h=hash(vec2(cx,1.3));
  float y=fract(uv.y*1.5+u_time*(0.35+0.2*h)+h*7.0);
  float lx=abs(fract(uv.x/cw)-0.5)*cw;
  float streak=smoothstep(0.013,0.003,lx)*smoothstep(0.0,0.15,y)*smoothstep(0.45,0.25,y)*step(0.45,h);
  col=mix(col,vec3(0.88,0.90,0.93),streak*0.2);
  col=mix(col,vec3(0.55,0.58,0.62),0.08);
  gl_FragColor=vec4(col,1.0);
}