Введение. Секретный метод интерполяции градиентов
Введение
Этой статьёй я открываю серию статей “Photoshop Algorithms Arcana”, призванную раскрыть алгоритмы Photoshop для рендеринга градиентов, эффектов, adjustment layers и т.д.
Зачем? Я работаю над инструментом, который позволяет, не имея Photoshop, рендерить отдельные слои/группы PSD/PSB, с сохранением всех эффектов. И так оказалось, что информации о проприетарных алгоритмах Photoshop — невероятно мало, и в большинстве своём они являются очень далёким приближением, результаты которого разительно отличаются от того, что рендерит фотошоп.
Кроме того, я надеюсь, что сделанные мною открытия помогут улучшить открытые инструменты, такие как Krita, GIMP, Photopea и другие, позволяя им взглянуть на пайплайн эффектов с другого угла и поддержать полноценно пайплайн photoshop особенно в области рендеринга эффектов и градиентов.
Disclaimer
Все алгоритмы, приведённые в этой статье — следствие black-box reverse engineering. Что означает, что все полученные алгоритмы в результате исследования — построены на попытках воспроизвести изображения, идентичные тем, что выдаёт Photoshop. Я не декомпилировал код Photoshop или других инструментов, всё что я имел на руках — готовые изображения, которые я рендерил в Photoshop и пытался их воспроизвести независимо.
Приведённые алгоритмы могут отличаться от тех, что использует на самом деле Adobe, и являются максимальным приближением, которого я смог добиться, достаточным для того, чтобы обычный человек с трудом мог понять, где результат Photoshop, а где результат моих алгоритмов.
С этим разобрались. Теперь перейдём к тому, с чего началось исследование.
Секретный метод интерполяции
Пока я работал над разбором формата и алгоритмов Photoshop, наткнулся на удивительную вещь — в версии 2026 методом интерполяции по умолчанию является не Perceptual, который занимал эту роль начиная с версии 2022, а некий Smooth.
Почему «некий»? Потому что он нигде не описан: ни в официальной документации (там упоминаются только Perceptual, Classic и Linear), ни на форумах, ни в туториалах. О его существовании можно узнать лишь по пункту в выпадающем меню. При этом он существенно отличается от всех остальных алгоритмов интерполяции, хотя ближе всего к Perceptual.
У Smooth отсутствует параметр Smoothness, и можно было бы предположить, что это просто частный случай Perceptual со Smoothness, выставленным на 100%, 75% или 50%.
Но оказывается, что нет — это отдельный вид интерполяции. Если сравнить два градиента с одинаковыми color-stops, один с методом Perceptual, а другой со Smooth, то ни одно из значений Smoothness не воспроизводит результат Smooth.
Если присмотреться, то можно увидеть, что в Perceptual синий глубже проникает в середину, а Smooth, оправдывая своё название, делает переходы мягче.
Для человеческого глаза они почти неотличимы при равномерных параметрах, когда midpoint находится в середине градиента. Однако чем ближе мидпоинт к границам, тем заметнее становится разница.
Давайте посмотрим на примеры, демонстрирующие явную разницу:
Что Diff говорит нам об алгоритме
Включите Diff-режим для градиентов с двумя цветами (Red → Blue) — результат очень показателен.
Стартовые позиции цвета и мидпоинт идентичны (выражены чёрным цветом), а вот промежутки между ними создают ощутимую разницу.
И эта разница принимает интересную форму: она набирает интенсивность в центре сегментов start → midpoint и midpoint → end, а затем сходит на нет к границам. Это наводит на мысли о сглаживающей per-segment S-curve.
Однако стоит переключить Diff на трёхцветный градиент (Red → Green → Blue) — и картина сильно усложняется. Разница уже не укладывается в простую посегментную кривую. Градиенты с несколькими цветовыми остановами имеют либо другой механизм, либо адаптированный, с которым нужно разбираться отдельно.
Что дальше
Разобраться в Smooth — конечная цель. Но перед этим мы обязаны понять Classic, Linear и Perceptual — три метода интерполяции, которые дадут нам базу.
Именно этим мы и займёмся в следующих статьях: как Photoshop рисует Classic, Linear и Perceptual градиенты.