В математике и ее приложениях функция знакового расстояния или поле знакового расстояния ( SDF ) — это ортогональное расстояние заданной точки x до границы множества Ω в метрическом пространстве (например, поверхности геометрической фигуры), причем знак определяется тем, находится ли x внутри Ω или нет . Функция имеет положительные значения в точках x внутри Ω, она уменьшается по значению, когда x приближается к границе Ω, где функция знакового расстояния равна нулю, и принимает отрицательные значения вне Ω. [1] Однако иногда вместо этого принимается и альтернативное соглашение (то есть отрицательно внутри Ω и положительно снаружи). [2] Эта концепция также иногда называется ориентированной функцией/полем расстояния .
Пусть Ω — подмножество метрического пространства X с метрикой d , а — его граница . Расстояние между точкой x пространства X и подмножеством X определяется, как обычно, как
где обозначает нижнюю грань .
Функция расстояния со знаком от точки x до X определяется как
Если Ω — подмножество евклидова пространства Rn с кусочно- гладкой границей, то функция знакового расстояния дифференцируема почти всюду , а ее градиент удовлетворяет уравнению эйконала
Если граница Ω равна C k для k ≥ 2 (см. Классы дифференцируемости ), то d равна C k в точках, достаточно близких к границе Ω. [3] В частности, на границе f удовлетворяет
где N — векторное поле внутренней нормали . Таким образом, функция расстояния со знаком является дифференцируемым расширением векторного поля нормы. В частности, гессиан функции расстояния со знаком на границе Ω дает отображение Вайнгартена .
Если, далее, Γ — область, достаточно близкая к границе Ω, так что f дважды непрерывно дифференцируема на ней, то существует явная формула, включающая отображение Вайнгартена W x для якобиана изменяющихся переменных в терминах функции расстояния со знаком и ближайшей граничной точки. В частности, если T ( ∂ Ω, μ ) — множество точек в пределах расстояния μ от границы Ω (т. е. трубчатая окрестность радиуса μ ), а g — абсолютно интегрируемая функция на Γ, то
где det обозначает определитель , а dS u указывает на то, что мы берем поверхностный интеграл . [4]
Алгоритмы для вычисления функции расстояния со знаком включают эффективный быстрый метод маршировки , быстрый метод подметания [5] и более общий метод набора уровней .
Для воксельного рендеринга быстрый алгоритм расчета SDF в геометрии такси использует таблицы суммированных площадей . [6]
Функции расстояния со знаком применяются, например, при рендеринге в реальном времени , [7] например, метод SDF-проецирования лучей и компьютерное зрение . [8] [9]
SDF использовался для описания геометрии объектов при рендеринге в реальном времени , обычно в контексте raymarching, начиная с середины 2000-х годов. К 2007 году Valve использовала SDF для рендеринга больших пиксельных (или с высоким DPI ) гладких шрифтов с ускорением GPU в своих играх. [10] Метод Valve не идеален, поскольку он работает в растровом пространстве , чтобы избежать вычислительной сложности решения проблемы в (непрерывном) векторном пространстве. Отображенный текст часто теряет острые углы. В 2014 году улучшенный метод был представлен Бехдадом Эсфахбодом . GLyphy Бехдада аппроксимирует кривые Безье шрифта с помощью дуговых сплайнов, ускоренных методами дискретизации на основе сетки (которые отбрасывают слишком далекие точки) для работы в реальном времени. [11]
Модифицированная версия SDF была введена как функция потерь для минимизации ошибки взаимопроникновения пикселей при рендеринге нескольких объектов. [12] В частности, для любого пикселя, который не принадлежит объекту, если он находится за пределами объекта при рендеринге, штраф не налагается; если это так, налагается положительное значение, пропорциональное его расстоянию внутри объекта.
В 2020 году игровой движок FOSS Godot 4.0 получил глобальное освещение в реальном времени (SDFGI) на основе SDF, что стало компромиссом между более реалистичным воксельным GI и запеченным GI. Его основное преимущество заключается в том, что его можно применять к бесконечному пространству, что позволяет разработчикам использовать его для игр с открытым миром. [13]
В 2023 году был выпущен фреймворк пользовательского интерфейса "GPUI" для рисования всех элементов пользовательского интерфейса с использованием графического процессора, многие части с использованием SDF. Автор утверждает, что создал редактор кода Zed , который выполняет рендеринг со скоростью 120 кадров в секунду. В работе используются список геометрических примитивов Иниго Куилеза в SDF, аппроксимированное гауссово размытие Эвана Уоллеса (соучредителя Figma ) в SDF и новый скругленный прямоугольник SDF. [14]