Ограничения 3D-рендеринга

См.также

В дополнение к ограничениям, указанным ниже, мобильные платформы имеют ещё больше ограничений в 3D-рендеринге по сравнению с настольными платформами. Дополнительную информацию см. в Mobile rendering limitations.

Введение

Из-за ориентированности на производительность движки рендеринга в реальном времени имеют множество ограничений. Визуализатор Godot - не исключение. Чтобы эффективно работать с этими ограничениями, вам необходимо их понимать.

Ограничения размера текстуры

На настольных компьютерах и ноутбуках текстуры размером более 8192 × 8192 могут не поддерживаться старыми устройствами. Вы можете узнать ограничения вашего целевого графического процессора на GPUinfo.org.

Мобильные графические процессоры обычно ограничены текстурами 4096×4096. Кроме того, некоторые мобильные графические процессоры не поддерживают повторение текстур, размер которых не равен степени двойки. Поэтому, если вы хотите, чтобы ваша текстура отображалась правильно на всех платформах, вам следует избегать использования текстур размером более 4096 × 4096 и использовать текстуры размерностью в степень двойки, если текстура должна повторяться.

Цветовая полоса

При использовании визуализаторов GLES3 или Vulkan, 3D-движок Godot выполняет внутреннюю визуализацию в HDR. Однако, результат рендеринга будет иметь тональную карту с низким динамическим диапазоном, чтобы его можно было отобразить на экране. Это может привести к появлению видимых полос, особенно при использовании нетекстурированных материалов. Это также можно увидеть в 2D-проектах при использовании плавных градиентных текстур.

Есть две основные вещи, которые следует отметить:

  • Включите Use Debanding в настройках проекта. Это применяет полноэкранный шейдер дебангинга как эффект пост-процессинга и очень легко. Полноэкранный дебангинг работает только если используется GLES3 или Vulkan рендеры. Так же нужно включить HDR в настройках проекта (стоит по умолчанию).

  • Как вариант, добавьте немного шума в текстуры. Это в основном эффективно в 2D, например, для эффектов виньетирования. В 3D вы также можете использовать настроенный дебандинг шейдер, который будет применен к вашим материалам. Эта техника работает, даже если ваш проект рендерится в LDR, что означает, что она будет работать при использовании рендера GLES2.

См.также

См. Banding in Games: A Noisy Rant для получения более подробной информации о цветовых полосах и способах борьбы с ним.

Точность буфера глубины

Для сортировки объектов в трёхмерном пространстве движки рендеринга используют буфер глубины (также называемый Z-буфером). Этот буфер имеет конечную точность: 24 разряда на настольных платформах, и иногда до 16 разрядов на мобильных платформах (по соображениям производительности). Если два разных объекта имеют одно и то же значение буфера, произойдет борьба за внимание зрителя. Это будет выглядеть как мерцающие текстуры, когда камера движется или вращается.

Чтобы сделать буфер глубины более точным по визуализируемой области, вы должны увеличить свойство Near узла Camera. Однако будьте осторожны: если вы установите его слишком высоко, игроки смогут видеть сквозь близлежащую геометрию. Вам также следует уменьшить свойство Far узла Camera до минимально допустимого значения для вашего варианта использования, но имейте в виду, что это не повлияет на точность так сильно, как свойство Near.

Если вам нужна высокая точность только тогда, когда игрок смотрит вдаль, вы можете динамически изменять её в зависимости от условий игры. Например, если игрок садится в самолёт, свойство Near может быть временно увеличено, чтобы избежать мерцания текстур на расстоянии. Затем его можно уменьшить, когда игрок покинет самолёт.

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

Сортировка прозрачности

В Godot прозрачные материалы рисуются после непрозрачных. Прозрачные объекты перед отрисовкой сортируются по порядку, основываясь на позиции Spatial, а не на позиции вершины в мировом пространстве. Из-за этого перекрывающиеся объекты часто могут быть отсортированы не по порядку. Чтобы исправить неправильно отсортированные объекты, настройте свойство материала Render Priority. Это заставит определенные материалы отображаться впереди или позади других прозрачных материалов. Но даже в этом случае этого может быть не всегда достаточно.

Некоторые механизмы рендеринга используют методы независимой от порядка прозрачности, но это дорого обходится для GPU-производительности. Godot в настоящее время не предоставляет эту функцию. Есть ещё несколько способов избежать эту проблему:

  • Делайте материалы прозрачными только в том случае, если это действительно необходимо. Если у материала есть только небольшая прозрачная часть, рассмотрите возможность разделения её на отдельные материалы. Это позволит непрозрачной части отбрасывать тени и может улучшить производительность.

  • Если ваша текстура в основном имеет полностью непрозрачные и полностью прозрачные области, вы можете использовать альфа-тестирование вместо альфа-смешивания. Этот режим прозрачности быстрее рендерится и не страдает от проблем с прозрачностью. Включите Parameters > Use Alpha Scissor в SpatialMaterial, и, при необходимости, настройте Alpha Scissor Threshold соответствующим образом. Обратите внимание, что MSAA не будет сглаживать края текстуры, в отличие от FXAA.

  • Если вам нужно отрисовывать полупрозрачные области текстуры, alpha scissor не подходят. Вместо этого можно установить свойство SpatialMaterial's Parameters > Depth Draw Mode на Opaque Pre-Pass, что иногда может сработать (с затратами производительности).

  • Если вы хотите, чтобы материал исчезал с увеличением расстояния, используйте режим затухания расстояния SpatialMaterial Pixel Dither или Object Dither вместо PixelAlpha, что сделает материал непрозрачным. Он также сможет отбрасывать тени.

Множественная выборка сглаживания (MSAA)

MSAA принимает несколько выборок покрытия на краях полигонов при визуализации объектов. Он не увеличивает количество образцов цвета, используемых для рендеринга сцены. Вот что это означает на практике:

  • Края сеток будут хорошо сглажены (как и при суперсэмплинге).

  • Прозрачные материалы, использующие альфа-тестирование (1-битная прозрачность), не будут сглажены.

  • Зеркальное наложение ("искры", появляющиеся на отражающих поверхностях) не будет уменьшено.

Есть несколько способов обойти это ограничение в зависимости от вашего бюджета производительности:

  • Чтобы сделать зеркальное наложение менее заметным, откройте Настройки проекта и включите Рендеринг > Качество > Фильтры экранного пространства > Ограничитель шероховатости экранного пространства (Rendering > Quality > Screen Space Filters > Screen Space Roughness Limiter). Этот фильтр имеет умеренную производительность. Его следует включать только в том случае, если он вам действительно нужен.

  • Включите FXAA в дополнение к (или вместо) MSAA. Поскольку FXAA - это метод сглаживания экранного пространства, он сгладит что угодно. Как недостаток, это также сделает сцену более размытой, особенно при разрешении ниже 1440p.

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