Использование декалей
Примечание
Декали поддерживаются только в рендерерах Forward+ и Mobile, но не в Compatibility.
При использовании рендерера совместимости рассмотрите возможность использования Sprite3D в качестве альтернативы для проецирования декалей на (в основном) плоские поверхности.
Декали (Decals) — это проецируемые текстуры, которые применяются к непрозрачным или прозрачным поверхностям в 3D. Эта проекция происходит в реальном времени и не зависит от генерации сетки. Это позволяет перемещать декали в каждом кадре с небольшим влиянием на производительность, даже при применении к сложным сеткам.
Хотя декали не могут добавлять реальные геометрические детали на проецируемую поверхность, они все равно могут использовать физически обоснованный рендеринг, чтобы обеспечить свойства, аналогичные свойствам полноценных PBR материалов.
В этом руководстве вы узнаете:
Как настроить декали в 3D-редакторе.
Как создавать декали во время игрового процесса в 3D-сцене (например, попадания пуль).
Как сбалансировать конфигурацию наклеек между производительностью и качеством.
См. также
Репозиторий демо-проектов Godot содержит пример 3D декалей.
Если вы хотите написать произвольный 3D-текст поверх поверхности, используйте 3D текст, размещенный близко к поверхности, вместо узла Decal.
Случаи использования
Статический декор
Иногда самый быстрый способ добавить текстурную детализацию к сцене — использовать декали. Это особенно актуально для органических деталей, таких как пятна грязи или песка, разбросанные по большой поверхности. Декали могут помочь разбить повторение текстур в сценах и сделать узоры более естественными. В меньшем масштабе декали также можно использовать для создания вариаций деталей для объектов. Например, декали можно использовать для добавления гаек и болтов поверх геометрии твердой поверхности.
Поскольку декали могут добавлять собственные свойства PBR поверх проецируемых поверхностей, их также можно использовать для создания следов или мокрых луж.
Грязь, добавленная поверх геометрии уровня с помощью декалей
Динамичные элементы игрового процесса
Наклейки (Decals) могут отображать временные или постоянные игровые эффекты, такие как попадания пуль и ожоги от взрывов.
Используя узел AnimationPlayer или скрипт, можно сделать так, чтобы декали со временем исчезали (а затем удалялись с помощью queue_free()) для повышения производительности.
Каплевидные тени (Blob shadows)
Blob-тени часто используются в мобильных проектах (или для следования стилю ретро-арта), поскольку освещение в реальном времени, как правило, слишком затратно на недорогих мобильных устройствах. Однако, полагаясь на запеченные карты освещения с полностью запеченными источниками света, динамические объекты не будут отбрасывать никаких теней от этих источников света. Это делает динамические объекты в сценах с картами освещения плоскими по сравнению с освещением в реальном времени, а динамические объекты выглядят почти так, как будто они парят.
Благодаря теням от капель динамические объекты все еще могут отбрасывать приблизительную тень. Это не только помогает с восприятием глубины сцены, но и может быть элементом игрового процесса, особенно в 3D-платформерах. Длина тени капли может быть увеличена, чтобы игрок знал, где он приземлится, если упадет прямо вниз.
Даже при освещении в реальном времени, тени-blob могут быть полезны как форма окружающего затенения в ситуациях, когда SSAO слишком затратен или слишком нестабилен из-за своей экранной природы. Например, тени снизу транспортных средств хорошо представлены с помощью теней-blob.
Blob-тень пятна при сравнении объектов
Краткое руководство пользователя
Создание декалей в редакторе
Создайте узел Decal в 3D-редакторе.
В инспекторе разверните раздел Textures и загрузите текстуру в Albedo.
Переместите узел Decal к объекту, затем поверните его так, чтобы наклейка (decal) была видна (и имела правильную ориентацию). Если наклейка выглядит зеркально, попробуйте повернуть ее на 180 градусов. Вы можете еще раз проверить, имеет ли она правильную ориентацию, увеличив Parameters > Normal Fade до 0,5. Это предотвратит проецирование Decal на поверхности, которые не обращены к наклейке.
Если ваша декаль должна влиять только на статические объекты, настройте ее так, чтобы она не влияла на динамические объекты (или наоборот). Для этого измените свойство Cull Mask декали, чтобы исключить определенные слои. После этого измените узлы MeshInstance3D ваших динамических объектов, чтобы изменить их слои видимости. Например, вы можете переместить их со слоя 1 на слой 2, а затем отключить слой 2 в свойстве Cull Mask декали.
Свойства узла Decal
Extents (Экстенты): Размер декали. Ось Y определяет длину проекции декали. Сохраняйте длину проекции как можно короче, чтобы улучшить возможности отбраковки, тем самым повышая производительность.
Текстуры
Albedo: Карта альбедо (диффузия/цвет), используемая для декали. В большинстве случаев это текстура, которую вы хотите задать первой. Если вы используете карту нормалей или ORM, карта альбедо должна быть установлена для предоставления альфа-канала. Этот альфа-канал будет использоваться в качестве маски для определения того, насколько карты нормалей/ORM повлияют на нижележащую поверхность.
Normal: Карта нормалей для использования в декале. Это можно использовать для увеличения воспринимаемой детализации декали, изменяя реакцию света на нее. Влияние этой текстуры умножается на альфа-канал текстуры альбедо (но не на Albedo Mix).
ORM: Карта Occlusion/Roughness/Metallic для использования в декале. Это оптимизированный формат для хранения карт материалов PBR. Карта Ambient Occlusion хранится в красном канале, карта roughness — в зеленом канале, карта metallic — в синем канале. Влияние этой текстуры умножается на альфа-канал текстуры альбедо (но не на Albedo Mix).
Emission: Текстура эмиссии для использования в наклейке. В отличие от Albedo, эта текстура будет светиться в темноте.
Параметры
Emission Energy: (Энергия излучения:) Яркость текстуры излучения.
Modulate: (Модулировать:) Умножает цвет текстур альбедо и излучения. Используйте это для тонирования декалей (например, для декалей-красок или для увеличения вариации путем рандомизации модуляции каждой декали).
Albedo Mix: Непрозрачность текстуры альбедо. В отличие от использования текстуры альбедо с более прозрачным альфа-каналом, уменьшение этого значения ниже
1.0не уменьшает влияние текстуры нормали/ORM на подстилающую поверхность. Установите это значение на0.0при создании декалей только нормали/ORM, таких как шаги или мокрые лужи.Normal Fade: (Нормальное затухание:) Затухает декаль, если угол между AABB декали и целевой поверхностью становится слишком большим. Значение
0.0проецирует декаль независимо от угла, тогда как значение0.999ограничивает декаль поверхностями, которые почти перпендикулярны. Установка Нормального затухания на значение больше0.0имеет небольшие затраты производительности из-за дополнительных вычислений нормального угла.
Вертикальное затухание
Upper Fade: (Верхнее затухание:) Кривая, по которой декаль будет затухать по мере удаления поверхности от центра AABB (по направлению к углу проекции декали). Допустимы только положительные значения.
Lower Fade: (Нижнее затухание:) Кривая, по которой декаль будет затухать по мере удаления поверхности от центра AABB (от угла проекции декали). Допустимы только положительные значения.
Затухание на расстоянии
Enabled: (Включено:) Управляет включением затухания на расстоянии (форма LOD). Декаль будет затухать в течение Begin + Length, после чего она будет отбракована и вообще не будет отправлена в шейдер. Используйте это, чтобы уменьшить количество активных декалей в сцене и тем самым повысить производительность.
Begin (Начало): Расстояние от камеры, на котором декаль начинает исчезать (в 3D-единицах).
Length (Длина): Расстояние, на котором декаль исчезает (в 3D-единицах). Декаль постепенно становится более прозрачной на этом расстоянии и полностью невидима в конце. Более высокие значения приводят к более плавному переходу затухания, что больше подходит для случаев, когда камера движется быстро.
Маска отсечения
Cull Mask: Указывает, на какие слои VisualInstance3D будет проецироваться эта декаль. По умолчанию декали влияют на все слои. Это используется, чтобы вы могли указать, какие типы объектов получают декаль, а какие нет. Это особенно полезно, чтобы вы могли гарантировать, что динамические объекты случайно не получат декаль, предназначенную для ландшафта под ними.
Порядок отрисовки декалей
По умолчанию декали упорядочиваются на основе размера их AABB и расстояния до камеры. AABB-ы, которые находятся ближе к камере, визуализируются первыми, что означает, что порядок визуализации декалей иногда может меняться в зависимости от положения камеры, если некоторые декали расположены в одном и том же месте.
Чтобы решить эту проблему, можно настроить свойство Sorting Offset (Смещение сортировки) в разделе VisualInstance3D инспектора узла Decal. Это смещение не является строгим порядком приоритета, а руководством, которое будет использовать рендерер, поскольку размер AABB по-прежнему влияет на то, как работает сортировка декалей. Поэтому более высокие значения всегда приведут к тому, что декаль будет отрисовываться выше других декалей с меньшим смещением сортировки.
Если вы хотите, чтобы декаль всегда отображалась поверх других декалей, вам нужно установить ее свойство Sorting Offset на положительное значение, большее, чем длина AABB самой большой декали, которая может ее перекрывать. Чтобы сделать эту декаль нарисованной позади других декалей, установите Sorting Offset на то же отрицательное значение.
Сравнение Смещения Сортировки VisualInstance3D на Декалях
Настройка производительности и качества
Производительность рендеринга декалей в основном определяется их покрытием экрана, но также и их количеством. В целом, рендеринг нескольких больших декалей, покрывающих большую часть экрана, будет дороже, чем рендеринг множества маленьких декалей, разбросанных повсюду.
Для повышения производительности рендеринга можно включить свойство Distance Fade (Исчезать на расстоянии), как описано выше. Это заставит дальние декали исчезать, когда они находятся далеко от камеры (и может не оказать существенного влияния на конечный рендеринг сцены). Используя группы узлов, можно также предотвратить появление ненужных декоративных декалей на основе конфигурации пользователя.
Способ рендеринга декалей также влияет на производительность. Расширенная настройка проекта Rendering > Textures > Decals > Filter позволяет вам контролировать, как должны фильтроваться текстуры декалей. Nearest/Linear не использует mip-текстуры. Однако декали будут выглядеть зернистыми на расстоянии. Nearest/Linear Mip-текстуры будут выглядеть более гладкими на расстоянии, но декали будут выглядеть размытыми при просмотре под косыми углами. Эту проблему можно решить с помощью Nearest/Linear Mip-текстуры Anisotropic, которая обеспечивает наивысшее качество, но также медленнее рендерится.
Если ваш проект имеет стиль пиксельной графики, рассмотрите возможность установки фильтра на одно из значений Nearest (Ближайший), чтобы декали использовали фильтрацию ближайшего соседа. В противном случае придерживайтесь Linear (Линейный).
Ограничения
Декали не могут влиять на свойства материала, кроме перечисленных выше, таких как высота (для параллаксного отображения).
По соображениям производительности декали используют чисто фиксированную логику рендеринга. Это означает, что декали не могут использовать пользовательские шейдеры. Однако пользовательские шейдеры на проецируемых поверхностях способны считывать информацию, которая переопределяется декалями поверх них, например, шероховатость и металличность.
При использовании рендерера Forward+ Godot использует подход кластеризации для рендеринга декалей. Можно добавить столько декалей, сколько необходимо (при условии, что позволяет производительность). Однако по-прежнему существует ограничение по умолчанию в 512 кластеризованных элементов, которые могут присутствовать в текущем виде камеры. Кластеризованный элемент — это всенаправленный свет, точечный свет, decal или reflection probe. Этот лимит можно увеличить, настроив Max Clustered Elements в Project Settings > Rendering > Limits > Cluster Builder.
При использовании Mobile рендерера на каждый отдельный Mesh ресурс можно нанести только 8 декалей. Если на одну сетку влияет больше декалей, не все из них будут отображены на сетке.