# 符号距离

  • 2D Signed Distance Function

# 符号距离函数

// -1 1
vec2 fixUV(in vec2 c){
  return (2. * c - iResolution.xy)/ min(iResolution.x,iResolution.y);
}

float sdfCircle(in vec2 p , float r){
  return length(p) - r;
}

void mainImage(out vec4 fragColor, in vec2 fragCoord){
    vec2 uv = fixUV(fragCoord);
    float d = sdfCircle(uv, .7);
    vec3 color =  1. - sign(d) * vec3(.4, .5, .6);
    color *= 1. - exp(-3. * abs(d));
    color *= .8 + .2 * sin(100. * abs(d)); // 等高线
    color = mix(color, vec3(1.),smoothstep(.005, .004, abs(d)));
    fragColor = vec4(color, 1.);
}

//  -1 1
vec2 fixUV(in vec2 c) {
  return (2. * c - iResolution.xy) / min(iResolution.x, iResolution.y);
}

float sdfCircle(in vec2 p, float r) { return length(p) - r; }

void mainImage(out vec4 fragColor, in vec2 fragCoord) {
  vec2 uv = fixUV(fragCoord);
  float d = sdfCircle(uv, .7);
  vec3 color = 1. - sign(d) * vec3(.4, .5, .6);
  color *= 1. - exp(-3. * abs(d));
  color *= .8 + .2 * sin(100. * abs(d)); // 等高线
  color = mix(color, vec3(1.), smoothstep(.005, .004, abs(d)));
  if (iMouse.z > .1) {
    vec2 m = fixUV(iMouse.xy);
    float currentDistance = abs(sdfCircle(m, .7));
    float circle = smoothstep(.01, 0., abs(length(uv - m) - currentDistance));
    color = mix(color, vec3(1., 1., 0.), circle);
    float circle_dot = smoothstep(.02, .01, length(uv - m));
    color = mix(color, vec3(1., 1., 0.), circle_dot);
  }
  fragColor = vec4(color, 1.);
}