Объёмный туман и объёмы тумана
Примечание
Объёмный туман поддерживается только в рендерере Forward+, но не в Mobile или Compatibility.
Как описано в Окружающая среда и постобработка, Godot поддерживает различные визуальные эффекты, включая два типа тумана: традиционный (необъёмный) и объёмный. Традиционный туман влияет на всю сцену сразу и не может быть настроен с помощью Шейдеры тумана.
Объёмный туман может использоваться одновременно с необъёмным, если это необходимо.
В этом руководстве вы узнаете:
Как настроить объёмный туман в Godot.
Что такое объёмы тумана и чем они отличаются от "глобального" объёмного тумана.
См. также
Вы можете увидеть объёмный туман в действии с помощью демонстрационного проекта Volumetric Fog.
Сравнение традиционного тумана (который не взаимодействует с освещением) и объёмного тумана, который может взаимодействовать с освещением:
Свойства объёмного тумана
После включения объёмного тумана в ресурсе Environment узла WorldEnvironment вы можете редактировать следующие свойства:
Density: Базовая экспоненциальная плотность объёмного тумана. Установите минимальную глобальную плотность. FogVolumes могут добавлять или вычитать из этой плотности в определённых областях. Значение
0.0отключает глобальный объёмный туман, но позволяет FogVolumes отображать туман в конкретных зонах. Рендеринг тумана экспоненциальный, как в реальной жизни.Albedo: Цвет объёмного тумана при взаимодействии со светом. Туман и дымка имеют альбедо, близкое к белому (
Color(1, 1, 1, 1)), а дым - более тёмное.Emission: Свет, излучаемый объёмным туманом. Даже с эмиссией туман не отбрасывает свет на другие поверхности. Эмиссия полезна для установки окружающего цвета. Поскольку эффект использует только однократное рассеяние, туману часто требуется небольшая эмиссия для смягчения резких теней.
Emission Energy: Яркость излучаемого света от объёмного тумана.
GI Inject: Масштабирует влияние глобального освещения на цвет альбедо объёмного тумана. Значение
0.0означает, что глобальное освещение не влияет на туман. При значениях выше0.0возникает небольшое снижение производительности.Anisotropy: Направление рассеяния света в объёмном тумане. Значение близкое к
1.0означает рассеяние вперёд. Значение0.0- равномерное рассеяние во всех направлениях. Значение-1.0- рассеяние назад. Туман и дымка слегка рассеивают свет вперёд, а дым - равномерно во всех направлениях.Length: Расстояние, на котором рассчитывается объёмный туман. Увеличьте для расчёта на большей дистанции, уменьшите для детализации при близком рассмотрении. Для лучшего качества поддерживайте минимальное значение.
Detail Spread: Распределение размера вокселей вдоль буфера. Высокие значения сжимают воксели ближе к камере, добавляя детализации на переднем плане.
Ambient Inject: Масштабирует влияние окружающего света на объёмный туман. Значение
0.0отключает влияние. При значениях выше0.0возникает небольшое снижение производительности.Sky Affect: Управляет влиянием объёмного тумана на фоновое небо. Значение
0.0полностью отключает влияние (включая FogVolumes).
В разделе Temporal Reprojection доступны два дополнительных свойства:
Temporal Reprojection > Enabled: Включает временную репроекцию для объёмного тумана. Временная репроекция смешивает туман текущего кадра с предыдущим для сглаживания неровных краёв. Затраты производительности минимальны, однако это может вызывать "призрачность" движущихся FogVolumes и Light3D, оставляя за ними след. При включённой репроекции старайтесь избегать быстрого перемещения FogVolumes или Light3D. Для кратковременных динамических световых эффектов установите Volumetric Fog Energy в
0.0, чтобы избежать призрачности.Temporal Reprojection > Amount: Степень смешивания предыдущего кадра с текущим. Более высокие значения дают более плавный туман, но усиливают "призрачность". Низкие значения уменьшают призрачность, но могут сделать видимым дрожание между кадрами.
Примечание
В отличие от необъёмного тумана, объёмный туман имеет ограниченную дальность. Это означает, что он не может полностью покрыть большой мир, так как на больших дистанциях рендеринг прекращается.
Если вы хотите скрыть от игрока удалённые области, рекомендуется включить одновременно и необъёмный, и объёмный туман, соответствующим образом настроив их плотность.
Взаимодействие света с объёмным туманом
Для имитации рассеяния света в тумане все типы источников света взаимодействуют с объёмным туманом. Степень влияния каждого источника регулируется свойством Volumetric Fog Energy на самом источнике. Включение теней на источнике сделает эти тени видимыми в объёмном тумане.
Если взаимодействие света с туманом нежелательно по художественным соображениям, его можно глобально отключить, установив Volumetric Fog > Albedo в чисто чёрный цвет в ресурсе Environment. Также можно отключить для конкретных источников, установив их Volumetric Fog Energy в 0. Это также немного улучшит производительность, исключив источник из расчётов объёмного тумана.
Использование объёмного тумана как решения для объёмного освещения
Хотя это и не физически точно, можно настроить параметры объёмного тумана как решение для объёмного освещения. Это означает, что неосвещённые части среды не будут затемняться туманом, но свет всё ещё сможет делать туман ярче в определённых областях.
This can be done by setting volumetric fog density to the lowest permitted value
greater than zero (0.0001), then increasing the Volumetric Fog Energy
property on lights to much higher values than the default to compensate. Values
between 200.0 and 5000.0 usually work well for this.
Баланс производительности и качества
Доступно несколько настроек проекта для регулировки производительности и качества объёмного тумана:
Rendering > Environment > Volumetric Fog > Volume Size: Базовый размер, определяющий размер воксельного буфера по осям X и Y камеры. Финальный размер масштабируется в соответствии с соотношением сторон экрана. Увеличьте для более детализированного тумана, уменьшите для лучшей производительности.
Rendering > Environment > Volumetric Fog > Volume Depth: Количество срезов вдоль глубины воксельного буфера для объёмного тумана. Меньшее число эффективнее, но может вызывать артефакты при движении камеры.
Rendering > Environment > Volumetric Fog > Use Filter: Включает фильтрацию тумана до интеграции. Это существенно размывает туман, поглощая мелкие детали, но так же сглаживает мелкие грани и артефакты сглаживания. Отключите, если требуется больше деталей.
Примечание
Объемный туман может вызывать полосы на экране. Особенно при высокой плотности. См. Цветовая полоса для рекомендаций по устранению полос.
Использование объёмов тумана для локального объёмного тумана
Иногда нам нужно, чтобы туман ограничивался определенной областью. Или же наоборот, нужно сделать туман глобальным, но без определенных областей. Оба случая могут быть реализованы с помощью узлов FogVolume.
Краткое введение в FogVolumes:
Убедитесь, что Volumetric Fog включен в свойствах окружения (Enviroment). Если глобальность не нужна, установите свойство Density на
0.0.Создание узла FogVolume.
Назначение нового FogMaterial материалу узла FogVolume.
Назначьте Density в материале FogMaterial положительное значение, чтобы повысить плотность в пределах FogVolume. Назначьте негативное значение, чтобы вычесть плотность из глобального тумана.
Настройте границы FogVolume и его форму, если необходимо.
Примечание
Тонкие объёмы тумана могут проскальзывать/мерцать когда камера в движении. Это может быть предотвращено, изменив в настройках проекта Рендеринг > Среда > Объёмный Туман > Глубина объёма (с ценой производительность), или же уменьшив в свойствах объемного тумана среды Длина (без потери произовительности, но с ценой уменьшенной дальности тумана). Можно также уменьшить плотность FogVolume в Материал, или же сделать узел толще.
Свойства FogVolume
Extents: Размер FogVolume, когда Shape - это Ellipsoid, Cone, Cylinder или Box. При Cone или Cylinder, конус или цилиндр будут растянуты так, чтобы соответствовать границам (extents). Не поддерживается неравномерное масштабирование через Extents, но вы можете масштабировать FogVolume напрямую.
Shape Форма FogVolume. Может быть Ellipsoid, Cone, Cylinder, Box или World (ведет себя, как глобальный туман).
Material Материал, используемый FogVolume. Может быть встроенным FogMaterial, или пользовательским ShaderMaterial (Шейдеры тумана).
После выбора New FogMaterial в свойстве Material можно настроить следующие свойства FogMaterial:
Плотность: Плотность FogVolume. Более плотные объекты будут казаться более непрозрачным, но может страдать от недостатка сэмплов в виже полосок. Отрицательные значения могут быть использованы для вычитания тумана от других FogVolume или глобального объёмного тумана.
Albedo (Альбедо): Цвет однократного рассеяния для FogVolume. Внутренне альбедо преобразуется в однократное рассеяние, которое аддитивно смешивается с другими FogVolumes и Albedo глобального объёмного тумана.
Emission (Свечение): Цвет света, излучаемого FogVolume. Излучаемый свет не отбрасывает тени на другие объекты, но может использоваться для независимого управления цветом FogVolume.
Height Falloff (Спад по высоте): Скорость уменьшения плотности тумана с ростом высоты в мировом пространстве. Высокое значение создаёт резкий переход, низкое - плавный. Значение
0.0даёт туман равномерной плотности. Порог высоты определяется высотой связанного FogVolume.Edge Fade (Затухание краёв): Жёсткость границ FogVolume. Высокое значение создаёт мягкие края, низкое - чёткие границы.
Density Texture (Текстура плотности): 3D-текстура для масштабирования плотности тумана внутри FogVolume. Позволяет создавать статические вариации плотности. Для анимированных эффектов используйте пользовательский шейдер тумана. Любое изображение можно импортировать как 3D-текстуру через доку Import.
Использование 3D-шумовых текстур плотности
Начиная с Godot 4.1, доступен ресурс NoiseTexture3D для процедурной генерации 3D-шума. Идеально подходит для текстур плотности FogMaterial, создавая более детализированные эффекты тумана:
Скриншот сделан с настройкой проекта Volume Size (Размер объёма) = 192 для лучшей видимости высокочастотных деталей в тумане.
Для этого выберите свойство Density Texture и создайте New NoiseTexture3D. Отредактируйте его, нажмите Noise в свойствах и создайте New FastNoiseLite. Настройте ширину, высоту и глубину текстуры в соответствии с размерами объёма тумана.
Для оптимизации используйте небольшие размеры текстур (64×64×64 или меньше), так как высокочастотные детали малозаметны в FogVolume. Для детализированных вариаций увеличьте Rendering > Environment > Volumetric Fog > Volume Size в настройках проекта ценой производительности.
Примечание
Color Ramp (Цветовой градиент) NoiseTexture3D влияет на текстуры плотности, но поскольку сэмплируется только красный канал текстуры, только красный канал градиента влияет на итоговую плотность.
Однако использование цветового градиента не окрасит объём тумана согласно текстуре. Для этого потребуется пользовательский шейдер, читающий Texture3D.
Пользовательские шейдеры для FogVolume
Эта страница охватывает только встроенные настройки FogMaterial. Для кастомизации поведения тумана в узле FogVolume (например, анимированного тумана) используйте пользовательские шейдеры тумана.
Имитация объёмного тумана с помощью квадов
В некоторых случаях лучше использовать специально настроенные QuadMesh вместо объёмного тумана:
Квады работают во всех рендерерах, включая Mobile и Compatibility.
Квадам не требуется временная репроекция для плавности, что делает их подходящими для быстрых эффектов (лазеры). Также они могут отображать мелкие детали, недоступные объёмному туману.
Квады обычно менее затратны по производительности, чем объёмный туман.
Однако у этого подхода есть недостатки:
Менее реалистичное затухание, особенно при входе камеры в туман.
Проблемы сортировки прозрачности при пересечении спрайтов.
Производительность может быть хуже объёмного тумана при множестве спрайтов близко к камере.
Создание спрайта тумана на основе QuadMesh:
Создайте MeshInstance3D с ресурсом QuadMesh в свойстве Mesh. Настройте размер.
Создайте StandardMaterial3D в свойстве Material сетки.
В StandardMaterial3D установите: Shading > Shading Mode = Unshaded, Billboard > Mode = Enabled, включите Proximity Fade и установите Distance Fade = Pixel Alpha.
Назначьте текстуру ниже в Albedo > Texture (ПКМ → Save as…):
После назначения текстуры в доке Import выберите текстуру и установите Compression Mode = Lossless для улучшения качества.
Цвет тумана задаётся свойством Albedo > Color; его плотность регулируется с помощью альфа-канала цвета. Для наилучших результатов потребуется настроить Proximity Fade > Distance и Distance Fade > Max Distance в зависимости от размера вашего QuadMesh.
При необходимости billboarding можно отключить, если расположить квад так, чтобы все его углы находились внутри сплошной геометрии. Это может быть полезно для создания тумана на больших плоскостях, в которые камера не может зайти (например, бездонные пропасти).