Jump to content

Гладкий шаг

График функций Smoothstep( x ) и Smootherstep( x ) с использованием 0 в качестве левого края и 1 в качестве правого края.

Smoothstep — это семейство сигмовидных функций интерполяции и ограничения , обычно используемых в компьютерной графике . [1] [2] движки видеоигр , [3] и машинное обучение . [4]

Функция зависит от трех параметров: входного x , «левого края» и «правого края», при этом левый край предполагается меньшим, чем правый край. Функция получает действительное число x в качестве аргумента и возвращает 0, если x меньше или равно левому краю, 1, если x больше или равно правому краю, и плавно интерполирует, используя полином Эрмита , между 0 и 1 иначе. Градиент функции Smoothstep равен нулю на обоих краях. Это удобно для создания последовательности переходов с использованием Smoothstep для интерполяции каждого сегмента в качестве альтернативы использованию более сложных или дорогостоящих методов интерполяции.

В HLSL и GLSL Smoothstep реализует , кубическая интерполяция Эрмита после зажима :

Предполагая, что левое ребро равно 0, правое ребро равно 1, при этом переход между ребрами происходит при 0 ≤ x ≤ 1.

Модифицированный пример реализации C/C++, предоставленный AMD. [5] следует.

float smoothstep (float edge0, float edge1, float x) {
   // Scale, and clamp x to 0..1 range
   x = clamp((x - edge0) / (edge1 - edge0));

   return x * x * (3.0f - 2.0f * x);
}

float clamp(float x, float lowerlimit = 0.0f, float upperlimit = 1.0f) {
  if (x < lowerlimit) return lowerlimit;
  if (x > upperlimit) return upperlimit;
  return x;
}

Общая форма Smoothstep , опять же предполагая, что левый край равен 0, а правый край равен 1, выглядит следующим образом:

идентична функции зажима :

Характерная S-образная сигмовидная кривая получается при только для целых чисел n ≥ 1. Порядок многочлена x в общем плавном шаге равен 2 n + 1. При n = 1 наклоны или первые производные гладкого шага равны нулю на левом и правом краях ( = 0 и x = 1), где кривая присоединяется к постоянному или насыщенному уровню. При более высоком целом n вторая и старшие производные равны нулю по краям, что делает полиномиальные функции максимально плоскими, а соединение с предельными значениями 0 или 1 более плавным.

Вариации

[ редактировать ]

Кен Перлин предложил [6] улучшенная версия широко используемой функции плавного шага первого порядка, эквивалентной второму порядку ее общей формы. 1-го и 2-го порядка Он имеет нулевые производные при x = 0 и x = 1:

Эталонная реализация C/C++:

float smootherstep(float edge0, float edge1, float x) {
  // Scale, and clamp x to 0..1 range
  x = clamp((x - edge0) / (edge1 - edge0));

  return x * x * x * (x * (6.0f * x - 15.0f) + 10.0f);
}

float clamp(float x, float lowerlimit = 0.0f, float upperlimit = 1.0f) {
  if (x < lowerlimit) return lowerlimit;
  if (x > upperlimit) return upperlimit;
  return x;
}

Источник

[ редактировать ]

уравнение 3-го порядка

[ редактировать ]

Начнем с общей полиномиальной функции третьего порядка и ее первой производной :

Применение желаемых значений функции в обеих конечных точках:

Применение желаемых значений для первой производной функции в обеих конечных точках:

Решение системы 4 неизвестных, образованной последними 4 уравнениями, приводит к значениям коэффициентов полинома:

третьего порядка В результате получается функция «плавного шага» :

уравнение 5-го порядка

[ редактировать ]

Начнем с общей полиномиальной функции пятого порядка, ее первой производной и второй производной:

Применение желаемых значений функции в обеих конечных точках:

Применение желаемых значений для первой производной функции в обеих конечных точках:

Применение желаемых значений для второй производной функции в обеих конечных точках:

Решение системы из 6 неизвестных, образованной последними 6 уравнениями, приводит к значениям коэффициентов полинома:

пятого порядка В результате получается функция «плавного шага» :

уравнение 7-го порядка

[ редактировать ]

Применяя аналогичные методы, уравнение 7-го порядка имеет вид:

Обобщение на уравнения более высокого порядка

[ редактировать ]

Полиномы плавного шага являются обобщенными, при этом 0 ≤ x ≤ 1 как

где N определяет порядок результирующей полиномиальной функции, который равен 2 N + 1. Первые семь полиномов плавного шага с 0 ≤ x ≤ 1 равны

Дифференциал является

Можно показать, что полиномы плавного шага этот переход от 0 к 1 при переходе x от 0 к 1 можно просто отобразить в нечетной симметрии. полиномы

где

и

Аргумент RN ( x ) равен −1 ≤ x ≤ 1 и добавляется к константе −1 слева и +1 справа.

Реализация в Javascript: [7]

// Generalized smoothstep
function generalSmoothStep(N, x) {
  x = clamp(x, 0, 1); // x must be equal to or between 0 and 1
  var result = 0;
  for (var n = 0; n <= N; ++n)
    result += pascalTriangle(-N - 1, n) *
              pascalTriangle(2 * N + 1, N - n) *
              Math.pow(x, N + n + 1);
  return result;
}

// Returns binomial coefficient without explicit use of factorials,
// which can't be used with negative integers
function pascalTriangle(a, b) {
  var result = 1; 
  for (var i = 0; i < b; ++i)
    result *= (a - i) / (i + 1);
  return result;
}

function clamp(x, lowerlimit, upperlimit) {
  if (x < lowerlimit)
    x = lowerlimit;
  if (x > upperlimit)
    x = upperlimit;
  return x;
}

Обратный плавный шаг

[ редактировать ]

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

Это возникает как обратное , ряд Маклорена которого заканчивается на , значение и выразить ту же функцию. С другой стороны, разложение обратного ряда в ряд не заканчивается.

В ГЛСЛ:

float inverse_smoothstep(float x) {
  return 0.5 - sin(asin(1.0 - 2.0 * x) / 3.0);
}
  1. ^ Smoothstep в сети разработчиков Microsoft .
  2. ^ Спецификация языка GLSL, версия 1.40 .
  3. ^ Документация по игровому движку Unity SmoothStep .
  4. ^ Хазиме, Хусейн; Пономарева Наталья; Мол, Петрос; Тан, Женьюй; Мазумдер, Рахул (2020). Слой древовидного ансамбля: дифференцируемость и условное вычисление (PDF) . Международная конференция по машинному обучению. ПМЛР.
  5. ^ Наталья Татарчук (2003). «Продвинутые методы шейдеров в реальном времени» . АМД . п. 94. Архивировано из оригинала 30 мая 2021 г. Проверено 16 апреля 2022 г.
  6. ^ Текстурирование и моделирование, третье издание: процедурный подход .
  7. ^ Общее уравнение плавного шага .
[ редактировать ]
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 0388882a0fb1a7cb2cb54d0ccdbd17fb__1718975400
URL1:https://arc.ask3.ru/arc/aa/03/fb/0388882a0fb1a7cb2cb54d0ccdbd17fb.html
Заголовок, (Title) документа по адресу, URL1:
Smoothstep - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)