# 函数绘制

  • mod() 函数用于计算一个数除以另一个数后的余数
  • SuperSampling 超采样是一种图形学技术,用于增加图像的分辨率或细节。

# 超采样的原理

  1. 高分辨率渲染:
    在一个比目标屏幕分辨率更高的网格上进行渲染。例如,如果目标屏幕分辨率为 1920x1080,则可以在一个 3840x2160 的网格上进行渲染。
  2. 结果缩放:
    将高分辨率渲染的结果缩小回原始的屏幕分辨率。使用插值算法(如双线性插值、双三次插值等)来平滑和减少锯齿效应。

# 取余和超采样

#define PI 3.14159265
#define AA 4

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

vec3 Grid(in vec2 uv){
  vec3 color = vec3(0.4);
  vec2 grid = floor(mod(uv, 2.));
  if(grid.x == grid.y) color = vec3(.6);
  color = mix(color, vec3(0.),smoothstep(1.1 * fwidth(uv.x), fwidth(uv.x),abs(uv.x)));
  color = mix(color, vec3(0.),smoothstep(1.1 * fwidth(uv.y), fwidth(uv.y),abs(uv.y)));
  return color;
}

float segment(in vec2 p, in vec2 a, in vec2 b, in float w){
  float f = 0.;
  vec2 ba = b - a;
  vec2 pa = p - a;
  float proj = clamp(dot(pa, ba) / dot(ba, ba), 0., 1.);
  float d = length(proj * ba - pa);
  if(d <= w){
    f = 1.;
  } 
  return f;
}

float func(in float x){
  float T = 4. + 2. * iTime ;
  return sin( 2. * PI / T * x);
}

float plotFunc(in vec2 uv){
  float f = func(uv.x);
  float w = .01;
  return smoothstep(f - w, f + w, uv.y);
}

void mainImage(out vec4 fragColor, in vec2 fragCoord){
  vec2 uv = fixUV(fragCoord);
  vec3 color = Grid(uv);
  float count = 0.;
  for(int m = 0; m < AA; m++){
    for(int n = 0 ; n < AA; n++){
      vec2 offset = (vec2(float(m),float(n)- .5 * float(AA))/ float(AA) * 2.);
      count += plotFunc(fixUV(fragCoord + offset));
    }
  }
  if(count > float(AA * AA) / 2.){
    count = float(AA * AA) - count;
  }
  // 归一化
  count = count * 2. / float(AA * AA);
  color = mix(color,vec3(1.),vec3(count));
  // color = vec3(plotFunc(uv));
  fragColor = vec4(color, 1.0);
}