Memo & NPRWizard
NPRWizard NPRWizard
Привет, Мемо. Я тут экспериментировал с алгоритмом адаптивной детекции границ, который превращает растровые изображения в чёткие векторные контуры — как бы цифровая штриховка получается. Как бы ты подошёл к тому, чтобы превратить это в шейдер реального времени, который сохранит постоянную толщину линий при изменении масштаба, не теряя при этом детали?
Memo Memo
Звучит как типичный подход с использованием поля расстояний. Сначала вычисляешь карту границ в первом проходе, а потом во втором – преобразуешь её в знаковое поле расстояний. В шейдере ты можешь брать значения из этого поля расстояний и использовать step или smoothstep, чтобы решить, где рисовать линию. Толщина линии – просто константа в экранном пространстве, поэтому она остаётся неизменной при любом масштабировании. Если нужна работа в реальном времени, вычисляй поле расстояний с фиксированным разрешением и используй мип-карты для разных масштабов. Не забудь добавить ещё один канал для интенсивности, чтобы не терять детали при уменьшении разрешения поля. И, наконец, добавь небольшой проход с антиалиасингом, например, размытие по Гауссу с радиусом 2 пикселя, чтобы убрать пикселизацию. Так контур останется чётким при любом масштабе, без потери информации.
NPRWizard NPRWizard
Слушай, идея с полем расстояния – интересная, но позволь мне сказать – реальная толщина линий в NPR-шейдере не должна быть фиксированной величиной в экранном пространстве, это убивает визуальный вес, который даёт правильное масштабирование штриха. Тебе нужна иерархическая карта краёв: сначала определяй края, потом рассчитывай многоразрешённое знаковое поле расстояний, но привязывай ширину штриха к глубине сцены и диафрагме камеры, как будто ты рисуешь вручную. Затем, на финальном этапе, используй небольшой ядро для насечки, которое берёт пробы из поля расстояний и применяет крестовую насечку, меняющую плотность в зависимости от расстояния. Размытие по Гауссу в 2 пикселя – нормально для сглаживания, но фильтр с 3-мя шагами, который разделяется, даёт лучшее сглаживание без ореола размытия, который стирает мелкие детали. И, напоследок, кэшируй поле расстояний в текстуре, которую обновляешь только при изменении геометрии – нет смысла пересчитывать его каждый кадр. Так ты сохраняешь чёткость линий, осмысленность штрихов и ту благословенную артефактность, которая присуща нарисованному вручную кадру.
Memo Memo
Звучит как надежный план – только не забудь про буфер глубины высокой точности, иначе толщина линии будет масштабироваться некорректно, и появится дребезг на близких расстояниях. И ещё, подумай про 4x сэмплинг при создании поля расстояний, чтобы избежать артефактов в ядре штриховки. Кэширование при изменении геометрии сделает шейдер более отзывчивым. Пиши, какая получается плотность перекрестной штриховки на практике.