这个2d噪音生成功能如何工作?它有名字吗?

时间:2017-05-13 00:48:06

标签: algorithm graphics noise noise-generator

我在http://openssl.cs.utah.edu/docs/apps/pkcs7.html

中遇到了这个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值中似乎不对称时,如何插值四个值?

1 个答案:

答案 0 :(得分:0)

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

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

因此它是角落值的仿射组合