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

См.также

In addition to the limitations below, mobile platforms have even more limitations on 3D rendering compared to desktop platforms. See Mobile rendering limitations for more information.

Введение

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

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

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

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

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

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

There are two main ways to alleviate banding:

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

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

См.также

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

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

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

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

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

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

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

In Godot, transparent materials are drawn after opaque materials. Transparent objects are sorted back to front before being drawn based on the Spatial's position, not the vertex position in world space. Due to this, overlapping objects may often be sorted out of order. To fix improperly sorted objects, tweak the material's Render Priority property. This will force specific materials to appear in front or behind of other transparent materials. Even then, this may not always be sufficient.

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

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

  • If your texture mostly has fully opaque and fully transparent areas, you can use alpha testing instead of alpha blending. This transparency mode is faster to render and doesn't suffer from transparency issues. Enable Parameters > Use Alpha Scissor in SpatialMaterial, and adjust Alpha Scissor Threshold accordingly if needed. Note that MSAA will not anti-alias the texture's edges, but FXAA will.

  • If you need to render semi-transparent areas of the texture, alpha scissor isn't suitable. Instead, setting the SpatialMaterial's Parameters > Depth Draw Mode property to Opaque Pre-Pass can sometimes work (at a performance cost).

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

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

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

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

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

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

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

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

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

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