Гладкий шаг

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);
}
Ссылки
[ редактировать ]- ^ Smoothstep в сети разработчиков Microsoft .
- ^ Спецификация языка GLSL, версия 1.40 .
- ^ Документация по игровому движку Unity SmoothStep .
- ^ Хазиме, Хусейн; Пономарева Наталья; Мол, Петрос; Тан, Женьюй; Мазумдер, Рахул (2020). Слой древовидного ансамбля: дифференцируемость и условное вычисление (PDF) . Международная конференция по машинному обучению. ПМЛР.
- ^ Наталья Татарчук (2003). «Продвинутые методы шейдеров в реальном времени» . АМД . п. 94. Архивировано из оригинала 30 мая 2021 г. Проверено 16 апреля 2022 г.
- ^ Текстурирование и моделирование, третье издание: процедурный подход .
- ^ Общее уравнение плавного шага .
Внешние ссылки
[ редактировать ]- Использование Smoothstep (на языке шейдеров RenderMan ) профессора Малкольма Кессона.
- Уловки интерполяции от Яри Комппы
- Swift Interpolation Playground демонстрирует SmoothStep() , SmootherStep() и SmoothestStep() на игровой площадке Swift от Саймона Гладмана.
- Обратный плавный шаг от Иниго Килеза