2016-07-02 1 views
2

Я изучаю/реализую версию Perlin Noise и Improved Perlin Noise. Перлин говорит в своей статье, что он заменил функцию smoothstepPerlin Noise: Почему 2-й порядок интерполяции Производит нормальный/затеняющий артефакт?

3t^2 - 2t^3 

, что он использовал интерполировать 8 линейных функций на углах ячейки сетки с функцией:

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

Поскольку производная второго порядка из плавная функция прерывистая. Он говорит (и это ясно видно на изображении, который он показывает), что это вызывает некоторые визуальные артефакты из-за того, как выглядят нормали в результате использования этой функции. Теперь я понимаю, что такое прерывистая функция. Я также понимаю, как нормали вычисляются в шумовой функции Перлина, используя частные производные функции Perlin Noise, но я не понимаю, почему тот факт, что производная 2-го порядка не является непрерывной, вызывает проблему с нормалями. Нормали вычисляются с использованием производной 1-го порядка функции Шум, а не производной 2-го порядка. Итак, как может тот факт, что производная 2-го порядка не является непрерывной, оказывает такое влияние на нормали?

enter image description here

Для получения более подробной информации о improved Noise Function.

ответ

0

Так как же может случиться так, что производная 2-го порядка не является непрерывной? оказывает такое влияние на нормали?

Во-первых, помните, что производная 2-го порядка является производной 1-го порядка нормального порядка. Проблема заключается не в расчете нормалей, а в том, насколько плавно развиваются нормали в пространстве. Это напрямую повлияет на освещение и продемонстрирует гладкость основной функции, и, вообще говоря, чем более непрерывно выводимая функция, тем более гладкой она будет ощущаться.

Хотя прежний метод Перлина приводит к непрерывным нормалям непрерывности и непрерывному затенению, вы все равно можете определить, где граница, потому что затенение не имеет производной непрерывности, и наше восприятие предназначено для восприятия того, что это такое: непрерывная поверхность что не что гладко в этой границе

Посмотрите на этих четырех функций (сверху вниз):

  • вопиюще разрывных выполните картирование
  • Непрерывные отображения, разрывных дер ivative
  • Удерживание производное
  • Бесконечно Удерживание производное

     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); 
         } 
    

    Functions smoothness comparison

Последняя является гладким, но вы почти не могу сказать это от третьего. Но второй, хотя и непрерывное отображение, все еще позволяет вам чувствовать себя границы там.

Из-за прямого воздействия нормалей на освещение (предыдущий шейдер может быть легко выполнен как расчет освещения), вы в основном выбираете между вторым и третьим параметрами. Вот почему вы обычно хотите, чтобы нормали сами были постоянно дифференцируемыми, и не соглашались только на непрерывность.

+0

Не могли бы вы добавить несколько рисунков на картинку, в которых отображается результат каждой функции? –