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

Введение

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

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

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

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

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

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

Есть несколько способов уменьшить видимость полос. Вот несколько примеров:

  • Добавьте немного шума в свои текстуры. Это эффективно для 2D, например, при использовании эффектов виньетирования.
  • Реализуйте шейдер уменьшения видимости полос как screen-reading shader. В настоящее время Godot не предоставляет такого встроенного шейдера, но он может быть добавлен в будущем выпуске.

См.также

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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