Attention: Here be dragons
This is the latest
(unstable) version of this documentation, which may document features
not available in or compatible with released stable versions of Godot.
Checking the stable version of the documentation...
Ограничения 3D-рендеринга
Введение
Из-за ориентированности на производительность движки рендеринга в реальном времени имеют множество ограничений. Визуализатор Godot - не исключение. Чтобы эффективно работать с этими ограничениями, вам необходимо их понимать.
Ограничения размера текстуры
На настольных компьютерах и ноутбуках текстуры размером более 8192 × 8192 могут не поддерживаться старыми устройствами. Вы можете узнать ограничения вашего целевого графического процессора на GPUinfo.org.
Мобильные графические процессоры обычно ограничены текстурами 4096×4096. Кроме того, некоторые мобильные графические процессоры не поддерживают повторение текстур, размер которых не равен степени двойки. Поэтому, если вы хотите, чтобы ваша текстура отображалась правильно на всех платформах, вам следует избегать использования текстур размером более 4096 × 4096 и использовать текстуры размерностью в степень двойки, если текстура должна повторяться.
Чтобы ограничить размер определенной текстуры, которая может быть слишком большой для рендеринга, вы можете установить опцию импорта Процесс > Ограничение размера на значение больше 0. Это уменьшит размеры текстуры при импорте (сохраняя соотношение сторон), не влияя на исходный файл.
Цветовая полоса
When using the Forward+ or Mobile rendering methods, Godot's 3D engine renders internally in HDR. However, the rendering output will typically be written to a lower precision buffer. This can result in visible banding, especially when using untextured materials. For performance reasons, color precision is also lower when using the Mobile rendering method compared to Forward+.
When using the Compatibility rendering method, internal HDR rendering is not used and the color precision is the lowest of all rendering methods. This also applies to 2D rendering, where banding may be visible when using smooth gradient textures.
Есть две основные вещи, которые следует отметить:
Если вы используете методы рендеринга Forward+ или Forward Mobile, включите Use Debanding в Project Settings > Rendering > Anti Aliasing. Это применяет полноэкранный шейдер debanding в качестве эффекта постобработки и является очень дешевым.
Как вариант, добавьте немного шума в текстуры. Это в основном эффективно в 2D, например, для эффектов виньетирования. В 3D вы также можете использовать пользовательский шейдер для устранения полос, применяемый к вашим материалам. Эта техника работает, даже если ваш проект рендерится с низкой точностью цветопередачи, что означает её работоспособность при использовании методов рендеринга Mobile и Compatibility.
Сравнение цветовых полос (контраст увеличен для лучшей видимости)
См. также
Подробнее о цветовых полосах и способах борьбы с ними см. в Banding in Games: A Noisy Rant (PDF).
Точность буфера глубины
To sort objects in 3D space, rendering engines rely on a depth buffer (also called Z-buffer). This buffer has a finite precision: 32-bit on desktop platforms, 24-bit on mobile platforms (for performance reasons). If two different objects end up on the same buffer value, then Z-fighting will occur. This will materialize as textures flickering back and forth as the camera moves or rotates.
Чтобы сделать буфер глубины более точным по визуализируемой области, вы должны увеличить свойство 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. Это сделает материал непрозрачным, что также ускорит рендеринг.
Сравнение сортировки по прозрачности (альфа-смешанные материалы слева, альфа-ножничные материалы справа)