【问题标题】:Perlin Noise: Why Would 2nd Order Interpolant Derivative Create Normal/Shading Artefact?Perlin 噪声:为什么二阶插值导数会产生法线/着色伪影?
【发布时间】:2016-07-23 08:04:08
【问题描述】:

我正在研究/实现Perlin NoiseImproved Perlin Noise 的一个版本。 Perlin 在他的论文中说他替换了 smoothstep 函数

3t^2 - 2t^3

他曾经用函数在网格单元的角落插入 8 个线性函数:

6t^5 - 15t^4 + 10t^3

因为smoothstep函数的二阶导数是不连续的。他说(这在他展示的图像中清晰可见),由于使用此函数的结果,法线看起来像这样,这会导致一些视觉伪影。现在我明白了什么是不连续函数。我也了解如何使用 Perlin 噪声函数的偏导数在 Perlin 噪声函数中计算法线,但我不明白为什么二阶导数不连续这一事实会导致法线出现问题。使用噪声函数的一阶导数计算法线,而不是二阶导数。那么二阶导数不连续的事实怎么会对法线产生这样的影响呢?

更多详情请关注improved Noise Function

【问题讨论】:

    标签: math graphics derivative cg


    【解决方案1】:

    那么二阶导数不连续的事实怎么可能 对法线有这样的影响吗?

    首先,请记住二阶导数是法线的一阶导数。问题不在于计算法线,而在于法线在空间中进展的平滑程度。这将直接影响光照,并证明底层函数的平滑度,一般来说,函数越是可连续推导,感觉就越平滑。

    虽然 Perlin 的前一种方法会导致连续法线和连续着色,但您仍然可以分辨出边界在哪里,因为着色没有连续导数,而我们的感知旨在感知其本来面目:连续曲面不是那么在那个边界上是平滑的

    看看这四个函数(从上到下):

    • 明显不连续的映射
    • 连续映射,不连续导数
    • 连续导数
    • 无限连续导数

              half TriangleWave (half x) {
      
                  x = 2 * frac(x/2);
                  return min(x, 2 - x);
              }
      
              half SShape (half x) {
      
                  x = saturate(x);
                  return x * x * (3 - 2 * x);
              }
      
              fixed4 frag (v2f f) : SV_Target {
      
                  // Bottom to top coordinate system
                  half x = 3 * f.tex.x;
                  half y = f.tex.y;
      
                  if (y > 0.75)
                      return frac(x);
                  if (y > 0.5)
                      return TriangleWave(x);
                  if (y > 0.25)
                      return SShape(TriangleWave(x));
                  return 0.5 - 0.5 * cos(x*3.141592);
              }
      

    最后一个是最流畅的,但你几乎无法从第三个中分辨出来。 但是第二个虽然是连续映射,但仍然让您感觉到那里有一个边界。

    由于法线对光照的直接影响(之前的着色器可以很容易地作为光照计算),您基本上是在第二个和第三个选项之间进行选择。这就是为什么你通常希望法线本身是连续可微的,而不是满足于连续性

    【讨论】:

    • 能否请您在图片中添加一些箭头,以显示每个函数的结果?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-23
    • 2019-04-30
    • 2013-09-23
    • 2013-07-07
    • 2016-11-26
    • 1970-01-01
    相关资源
    最近更新 更多