Ограничения 3D-рендеринга
Введение
Из-за ориентированности на производительность движки рендеринга в реальном времени имеют множество ограничений. Визуализатор Godot - не исключение. Чтобы эффективно работать с этими ограничениями, вам необходимо их понимать.
Ограничения размера текстуры
На настольных компьютерах и ноутбуках текстуры размером более 8192 × 8192 могут не поддерживаться старыми устройствами. Вы можете узнать ограничения вашего целевого графического процессора на GPUinfo.org.
Мобильные графические процессоры обычно ограничены текстурами 4096×4096. Кроме того, некоторые мобильные графические процессоры не поддерживают повторение текстур, размер которых не равен степени двойки. Поэтому, если вы хотите, чтобы ваша текстура отображалась правильно на всех платформах, вам следует избегать использования текстур размером более 4096 × 4096 и использовать текстуры размерностью в степень двойки, если текстура должна повторяться.
Чтобы ограничить размер определенной текстуры, которая может быть слишком большой для рендеринга, вы можете установить опцию импорта Процесс > Ограничение размера на значение больше 0. Это уменьшит размеры текстуры при импорте (сохраняя соотношение сторон), не влияя на исходный файл.
Цветовая полоса
При использовании методов рендеринга Forward+ или Mobile, 3D-движок Godot внутренне рендерит в HDR. Однако результат рендеринга будет тонально отображён в низкий динамический диапазон для отображения на экране. Это может привести к видимым цветовым полосам, особенно при использовании материалов без текстур. По соображениям производительности, точность цветопередачи также ниже при использовании метода рендеринга Mobile по сравнению с Forward+.
При использовании метода Compatibility rendering, HDR не используется, а точность цвета самая низкая из всех методов рендеринга. Это также относится к 2D-рендерингу, где полосы могут быть видны при использовании гладких градиентных текстур.
Есть две основные вещи, которые следует отметить:
Если вы используете методы рендеринга Forward+ или Forward Mobile, включите Use Debanding в Project Settings > Rendering > Anti Aliasing. Это применяет полноэкранный шейдер debanding в качестве эффекта постобработки и является очень дешевым.
Как вариант, добавьте немного шума в текстуры. Это в основном эффективно в 2D, например, для эффектов виньетирования. В 3D вы также можете использовать пользовательский шейдер для устранения полос, применяемый к вашим материалам. Эта техника работает, даже если ваш проект рендерится с низкой точностью цветопередачи, что означает её работоспособность при использовании методов рендеринга Mobile и Compatibility.
Сравнение цветовых полос (контраст увеличен для лучшей видимости)
См. также
Подробнее о цветовых полосах и способах борьбы с ними см. в Banding in Games: A Noisy Rant (PDF).
Точность буфера глубины
Для сортировки объектов в трёхмерном пространстве движки рендеринга используют буфер глубины (также называемый Z-буфером). Этот буфер имеет конечную точность: 24 разряда на настольных платформах, и иногда до 16 разрядов на мобильных платформах (по соображениям производительности). Если два разных объекта имеют одно и то же значение буфера, произойдет борьба за внимание зрителя. Это будет выглядеть как мерцающие текстуры, когда камера движется или вращается.
Чтобы сделать буфер глубины более точным по визуализируемой области, вы должны увеличить свойство Near узла Camera. Однако будьте осторожны: если вы установите его слишком высоко, игроки смогут видеть сквозь близлежащую геометрию. Вам также следует уменьшить свойство Far узла Camera до минимально допустимого значения для вашего варианта использования, но имейте в виду, что это не повлияет на точность так сильно, как свойство Near.
Если вам нужна высокая точность только тогда, когда игрок смотрит вдаль, вы можете динамически изменять её в зависимости от условий игры. Например, если игрок садится в самолёт, свойство Near может быть временно увеличено, чтобы избежать мерцания текстур на расстоянии. Затем его можно уменьшить, когда игрок покинет самолёт.
В зависимости от сцены и условий просмотра, вы также можете перемещать конкурирующие объекты дальше друг от друга, чтобы игрок не видел разницы.
Сравнение Z-борьбы (до и после изменения сцены путем смещения Label3D от пола)
Сортировка прозрачности
В Godot прозрачные материалы рисуются после непрозрачных. Прозрачные объекты сортируются от дальних к ближним перед отрисовкой на основе положения Node3D, а не положения вершин в мировом пространстве. Из-за этого перекрывающиеся объекты могут часто сортироваться неправильно. Чтобы исправить неправильно отсортированные объекты, настройте свойство материала Render Priority или Sorting Offset узла. Render Priority заставит определённые материалы отображаться перед или за другими прозрачными материалами, а Sorting Offset переместит объект вперёд или назад для целей сортировки. Но даже тогда этого может быть недостаточно.
Некоторые механизмы рендеринга используют методы независимой от порядка прозрачности, но это дорого обходится для GPU-производительности. Godot в настоящее время не предоставляет эту функцию. Есть ещё несколько способов избежать эту проблему:
Делайте материалы прозрачными только при необходимости. Если у материала есть лишь небольшая прозрачная часть, рассмотрите возможность разделения её на отдельный материал. Это позволит непрозрачной части отбрасывать тени и также улучшит производительность.
Если ваша текстура в основном имеет полностью непрозрачные и полностью прозрачные области, вы можете использовать альфа-тестирование вместо альфа-смешивания. Этот режим прозрачности быстрее рендерится и не страдает от проблем с прозрачностью. Включите Transparency > Transparency в значение Alpha Scissor в StandardMaterial3D и при необходимости настройте Transparency > Alpha Scissor Threshold. Обратите внимание, что MSAA не будет сглаживать края текстуры, если в свойствах материала не включено альфа-сглаживание. Однако FXAA, TAA и суперсэмплинг смогут сглаживать края текстуры независимо от того, включено ли альфа-сглаживание на материале.
Если вам нужно рендерить полупрозрачные области текстуры, альфа-тестирование не подходит. Вместо этого можно установить свойство Transparency > Transparency StandardMaterial3D в Depth Pre-Pass, что иногда помогает (за счёт производительности). Также можно попробовать режим Alpha Hash.
Для создания эффекта исчезновения материала с расстоянием используйте в StandardMaterial3D режимы затухания Pixel Dither или Object Dither вместо Pixel Alpha. Это сделает материал непрозрачным, что также ускорит рендеринг.
Сравнение сортировки по прозрачности (альфа-смешанные материалы слева, альфа-ножничные материалы справа)