这种二维噪声生成功能是如何工作的?它有名字吗?



我在着色器之书中遇到了这个 2D 噪声函数

float noise(vec2 st) {
  vec2 integerPart = floor(st);
  vec2 fractionalPart = fract(st);
  float s00 = random(integerPart);
  float s01 = random(integerPart + vec2(0.0, 1.0));
  float s10 = random(integerPart + vec2(1.0, 0.0));
  float s11 = random(integerPart + vec2(1.0, 1.0));
  float dx1 = s10 - s00;
  float dx2 = s11 - s01;
  float dy1 = s01 - s00;
  float dy2 = s11 - s10;
  float alpha = smoothstep(0.0, 1.0, fractionalPart.x);
  float beta = smoothstep(0.0, 1.0, fractionalPart.y);
  return s00 + alpha * dx1 + (1 - alpha) * beta * dy1 + alpha * beta * dy2; 
}

很明显这个函数的作用:它在正方形的顶点生成四个随机数,然后对它们进行插值。我发现困难的是理解为什么插值(s00 + alpha * dx1 + (1 - alpha) * beta * dy1 + alpha * beta * dy2表达式(有效。当 x 和 y 值似乎不对称时,它如何插值四个值?

如果展开最后一行,则为:

return s00 * (1-alpha) * (1-beta) +
       s10 * alpha * (1-beta) +
       s01 * (1-alpha) * beta +
       s11 * alpha * beta;

在 x 和 y 中是对称的。 如果将权重相加:

alpha * beta + (1-alpha) * beta  + alpha * (1-beta) + (1-alpha) * (1-beta)
= (alpha + 1-alpha) * beta + (alpha + 1-alpha) * (1-beta)
= beta + 1-beta
= 1

所以它是拐角处值的仿射组合

相关内容

  • 没有找到相关文章

最新更新