3D сглаживание

См. также

Godot также поддерживает сглаживание при 2D-рендеринге. Это описано на странице 2D сглаживание.

Введение

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

В примере ниже можно заметить, как края приобретают блочный вид. Растительность также мерцает, а тонкие линии на верхней части коробки почти исчезли:

Изображение масштабируется в 2× раза с использованием фильтрации по ближайшему соседу, чтобы сделать алиасинг более заметным.

Изображение масштабируется в 2× раза с использованием фильтрации по ближайшему соседу, чтобы сделать алиасинг более заметным.

Для борьбы с этим в Godot можно использовать различные техники сглаживания. Они подробно описаны ниже.

См. также

Сравнить алгоритмы сглаживания в действии можно с помощью демо-проекта 3D Antialiasing.

Multisample сглаживание (MSAA)

Доступно во всех рендерерах.

Эта техника — "исторический" способ борьбы с алиасингом. MSAA очень эффективен для краёв геометрии (особенно на высоких уровнях). MSAA не вносит размытости.

MSAA доступен в 3 уровнях: 2×, 4×, 8×. Более высокие уровни эффективнее сглаживают края, но значительно требовательнее к ресурсам. В играх с современной графикой рекомендуется использовать 2× или 4× MSAA, так как 8× MSAA обычно слишком ресурсоёмок.

Недостаток MSAA в том, что он работает только с краями. Это происходит потому, что MSAA увеличивает количество coverage-сэмплов, но не количество color-сэмплов. Поскольку количество цветовых сэмплов не увеличивается, фрагментные шейдеры выполняются для каждого пикселя только один раз. Следовательно, MSAA не уменьшает алиасинг прозрачности для материалов в режиме Alpha Scissor (1-битная прозрачность). MSAA также неэффективен для спектрального алиасинга.

Для уменьшения алиасинга на материалах с альфа-ножницами можно включить alpha antialiasing (также называемый alpha to coverage) в свойствах конкретных материалов StandardMaterial3D или ORMMaterial3D. Alpha to coverage имеет умеренную стоимость производительности, но эффективно уменьшает алиасинг на прозрачных материалах без добавления размытости.

Чтобы сделать спектральный алиасинг менее заметным, используйте Screen-space roughness limiter, который включен по умолчанию.

MSAA можно включить в настройках проекта, изменив значение параметра Rendering > Anti Aliasing > Quality > MSAA 3D. Важно изменять значение настройки MSAA 3D, а не MSAA 2D, так как это совершенно разные параметры.

Сравнение без сглаживания (слева) и с разными уровнями MSAA (справа). Обратите внимание, что alpha antialiasing здесь не используется:

../../_images/antialiasing_msaa_2x1.webp ../../_images/antialiasing_msaa_4x1.webp ../../_images/antialiasing_msaa_8x1.webp

Временное сглаживание (TAA)

Доступно только в рендерере Forward+, но не в Mobile или Compatibility.

Временное сглаживание работает путём усреднения результатов ранее отрендеренных кадров в один высококачественный кадр. Это непрерывный процесс, который работает за счёт смещения позиций всех вершин сцены в каждом кадре. Это смещение выполняется для захвата субпиксельных деталей и должно быть незаметным, за исключением экстремальных ситуаций.

Эта техника широко используется в современных играх, так как она обеспечивает наиболее эффективное сглаживание спектрального алиасинга и других артефактов, вызванных шейдерами. TAA также обеспечивает полную поддержку сглаживания прозрачности.

TAA вносит небольшое размытие в статичных сценах, но этот эффект становится более заметным при движении камеры. Ещё один недостаток TAA — возможное появление артефактов ghosting (шлейфов) за движущимися объектами. Рендеринг с более высокой частотой кадров позволит TAA быстрее усреднять изображение, делая эти артефакты менее заметными.

Временное сглаживание можно включить в настройках проекта, изменив значение параметра Rendering > Anti Aliasing > Quality > TAA.

Сравнение без сглаживания (слева) и с TAA (справа):

../../_images/antialiasing_taa.webp

AMD FidelityFX Супер разрешение 2.2 (FSR2)

Доступно только в рендерере Forward+, но не в Mobile или Compatibility.

Начиная с Godot 4.2, встроена поддержка AMD FidelityFX Super Resolution 2.2. Это метод апскейлинга, совместимый со всеми современными GPU от любых производителей. FSR2 обычно предназначен для повышения производительности путём снижения внутреннего разрешения 3D-рендеринга с последующим увеличением до выходного разрешения.

Однако, в отличие от FSR1, FSR2 также обеспечивает временное сглаживание. Это означает, что FSR2 можно использовать в нативном разрешении для высококачественного сглаживания, когда входное разрешение равно выходному. В этом случае включение FSR2 фактически снизит производительность, но значительно улучшит качество рендеринга.

Использование FSR2 в нативном разрешении требует больше ресурсов, чем TAA в нативном разрешении, поэтому его рекомендуется использовать только при наличии значительного запаса производительности GPU. С другой стороны, FSR2 обеспечивает лучшее покрытие сглаживания с меньшей размытостью по сравнению с TAA, особенно в движении.

Сравнение без сглаживания (слева) и FSR2 в нативном разрешении (справа):

../../_images/antialiasing_fsr2_native.webp

Примечание

По умолчанию настройка проекта FSR Sharpness установлена в 0.2 (более высокие значения приводят к меньшему усилению резкости). Для целей сравнения на скриншоте выше усиление резкости FSR было отключено установкой значения 2.0.

Быстрое приближённое сглаживание (FXAA)

Это доступно только в Forward+ и Mobile renderers, а не в Compatibility renderer.

Быстрое приближённое сглаживание — это постобработочное решение для сглаживания. Оно работает быстрее других техник сглаживания и также поддерживает сглаживание прозрачности. Однако из-за отсутствия временной информации оно малоэффективно против спектрального алиасинга.

Эта техника до сих пор иногда используется в мобильных играх. Однако на десктопных платформах FXAA в целом уступило место временному сглаживанию, которое гораздо эффективнее против спектрального алиасинга. Тем не менее, предоставление FXAA в качестве опции в игре всё ещё может быть полезным для игроков со слабыми GPU.

FXAA вносит умеренное размытие при включении (больше, чем TAA в статике, но меньше, чем TAA при движении камеры).

FXAA можно включить в настройках проекта, изменив значение параметра Rendering > Anti Aliasing > Quality > Screen Space AA на FXAA.

Сравнение без сглаживания (слева) и с FXAA (справа):

../../_images/antialiasing_fxaa.webp

Суперсэмплинг (SSAA)

Доступно во всех рендерерах.

Суперсэмплинг обеспечивает наивысшее качество сглаживания, но также является самым ресурсоёмким. Он работает за счёт многократного рендеринга каждого пикселя сцены. Это позволяет SSAA одновременно сглаживать края, прозрачность и спектральный алиасинг без введения потенциальных артефактов ghosting.

Недостаток SSAA — его чрезвычайно высокая стоимость. Это обычно делает SSAA трудноприменимым в играх, но вы всё ещё можете найти суперсэмплинг полезным для офлайн-рендеринга.

Суперсэмплинг активируется увеличением расширенной настройки проекта Rendering > Scaling 3D > Scale выше 1.0 при условии, что Rendering > Scaling 3D > Mode установлен в Bilinear (по умолчанию). Поскольку коэффициент масштабирования определяется для каждой оси, коэффициент 1.5 даст 2.25× SSAA, а коэффициент 2.0 — 4× SSAA. Поскольку Godot использует аппаратную билинейную фильтрацию для уменьшения разрешения, результат будет выглядеть чётче при целочисленных коэффициентах масштабирования (а именно 2.0).

Сравнение без сглаживания (слева) и с разными уровнями SSAA (справа):

../../_images/antialiasing_ssaa_2.25x.webp ../../_images/antialiasing_ssaa_4x.webp

Предупреждение

Суперсэмплинг также требует большого объёма видеопамяти (VRAM), так как он требует рендеринга в целевом разрешении с последующим уменьшением до размера окна. Например, отображение проекта в 3840×2160 (4K) с 4× SSAA потребует рендеринга сцены в 7680×4320 (8K), что в 4 раза больше пикселей.

При использовании большого размера окна (например, 4K) увеличение масштаба разрешения сверх определённого значения может вызвать сильное замедление (или даже сбой) из-за нехватки VRAM.

Ограничитель шероховатости в экранном пространстве

Это доступно только в Forward+ и Mobile renderers, а не в Compatibility renderer.

Это не метод сглаживания краёв, но способ уменьшения спектрального алиасинга в 3D.

Ограничитель шероховатости наиболее эффективен на детализированной геометрии. Хотя он влияет на рендеринг самой карты шероховатости, его воздействие там ограничено.

Ограничитель шероховатости включён по умолчанию и не требует ручной настройки. Он оказывает небольшое влияние на производительность, поэтому рассмотрите возможность его отключения, если ваш проект не сильно страдает от спектрального алиасинга. Отключить его можно в настройке проекта Rendering > Quality > Screen Space Filters > Screen Space Roughness Limiter.

Ограничитель шероховатости текстур при импорте

Как и ограничитель в экранном пространстве, это не метод сглаживания краёв, но способ уменьшения спектрального алиасинга в 3D.

Ограничение шероховатости при импорте работает за счёт указания нормальной карты в качестве ориентира. Для этого выберите карту шероховатости в доке FileSystem, перейдите в док Import, установите Roughness > Mode в цветовой канал, в котором хранится карта шероховатости (обычно Green), затем укажите путь к нормальной карте материала. Не забудьте нажать Reimport внизу дока Import после указания пути к нормальной карте.

Поскольку эта обработка происходит исключительно при импорте, она не несёт затрат производительности. Однако её визуальное воздействие ограничено. Ограничение шероховатости при импорте помогает уменьшить спектральный алиасинг внутри текстур, но не влияет на алиасинг, возникающий на краях геометрии детализированных мешей.

Какую технику сглаживания мне использовать?

Не существует универсальной техники сглаживания. Поскольку сглаживание часто требует ресурсов GPU или может вносить нежелательную размытость, рекомендуется добавить настройку, позволяющую игрокам отключать сглаживание.

Для проектов с фотореалистичным художественным направлением TAA обычно является наиболее подходящим вариантом. Хотя TAA может вызывать артефакты ghosting, нет другой техники, которая бы так эффективно боролась со спектральным алиасингом. Ограничитель шероховатости помогает немного, но в целом гораздо менее эффективен против спектрального алиасинга. Если у вас есть запас производительности GPU, вы можете использовать FSR2 в нативном разрешении для более качественной формы временного сглаживания по сравнению со стандартным TAA.

Для проектов с малым количеством отражающих поверхностей (например, мультяшный стиль) хорошо подойдёт MSAA. MSAA также является хорошим вариантом, если важно избежать размытости и временных артефактов, как в соревновательных играх.

При работе на слабых платформах, таких как мобильные устройства или интегрированная графика, FXAA обычно является единственным жизнеспособным вариантом. 2× MSAA может быть применимо в некоторых случаях, но более высокие уровни MSAA вряд ли будут плавно работать на мобильных GPU.

Godot позволяет использовать несколько техник сглаживания одновременно. Обычно в этом нет необходимости, но это может улучшить визуальное качество на мощных GPU или при нереальновременном рендеринге. Например, для улучшения вида движущихся краёв при включённом TAA можно дополнительно включить MSAA.

Сравнение методов сглаживания

Особенность

MSAA

TAA

FSR2

FXAA

SSAA

SSRL

Сглаживание краёв

🟢 Да

🟢 Да

🟢 Да

🟢 Да

🟢 Да

🔴 Нет

Сглаживание спектрального алиасинга

🟡 Частично

🟢 Да

🟢 Да

🟡 Частично

🟢 Да

🟢 Да

Сглаживание прозрачности

🟡 Частично [1]

🟢 Да [2]

🟢 Да [2]

🟢 Да

🟢 Да

🔴 Нет

Добавляет размытие

🟢 Нет

🟡 Частично

🟡 Частично

🟡 Частично

🟡 Умеренное [3]

🟢 Нет

Артефакты ghosting

🟢 Нет

🔴 Да

🔴 Да

🟢 Нет

🟢 Нет

🟢 Нет

Затраты производительности

🟡 Средние

🟡 Средние

🔴 Высокие

🟢 Низкие

🔴 Очень высокие

🟢 Низкие

Forward+

✔️ Да

✔️ Да

✔️ Да

✔️ Да

✔️ Да

✔️ Да

Мобильные устройства

✔️ Да

❌ Нет

❌ Нет

✔️ Да

✔️ Да

✔️ Да

Совместимость

✔️ Да

❌ Нет

❌ Нет

❌ Нет

✔️ Да

❌ Нет