Объёмный туман и локальные области
Настроить общий туман, локальную дымку и расчистку отрицательной плотностью на готовой сцене Forward+.
Выбрать нужный эффект
Объёмный туман показывает свет в среде: дымку в помещении, лучи и локальные облака. Нужны Forward+, действующий Environment и VolumetricFogEnabled=true. FogEnabled управляет другим, обычным туманом и не включает FogVolume.
Для тумана во всём видимом пространстве задайте Environment.VolumetricFogDensity. Для локальной области добавьте FogVolume с FogMaterial. Глобальная плотность может оставаться нулевой: в этом случае туман появится только внутри объёмов.
Запустить готовую сцену
Скачать галерею с туманом. Нужны Reckfell 1.0.0 с C# SDK и Forward+/Vulkan. Распакуйте проект, откройте project.reckfell, соберите C# и запустите Main.rscene. Геометрия, материалы и источники уже включены в пример; внешние ассеты не нужны.
Корень использует FogGallery3D.cs ниже и базовый CinematicGallery3D.cs из архива. До запуска выберите экспортированное Preview: Clear, Global, Local или Carve. Для переключения из работающего кода вызывайте SetPreview(mode) после _Ready: простое изменение Preview во время игры не применяет настройки.
| Preview | Общая плотность | Локальный объём | Результат |
|---|---|---|---|
| Clear | 0 | скрыт | исходный кадр без плотности тумана |
| Global | 0.02 | скрыт | дымка по глубине галереи |
| Local | 0 | Density=0.08 | туман вокруг центральной установки |
| Carve | 0.02 | Density=-0.12 | локальное ослабление общего тумана |
FogGallery3D.cs
using Reckfell;
public partial class FogGallery3D : CinematicGallery3D
{
public enum FogPreview { Clear, Global, Local, Carve }
[Export] public FogPreview Preview { get; set; } = FogPreview.Local;
public FogVolume Mist { get; private set; } = null!;
public FogMaterial MistMaterial { get; private set; } = null!;
public override void _Ready()
{
base._Ready();
MistMaterial = new FogMaterial
{
Density = 0.08f, Albedo = new Color(0.65f, 0.76f, 0.9f),
Emission = Colors.Black, HeightFalloff = 0, EdgeFade = 0.5f
};
Mist = new FogVolume
{
Position = new Vector3(0, 2.6f, -10), Size = new Vector3(10, 5, 10),
Shape = RenderingServer.FogVolumeShape.Box, Material = MistMaterial
};
AddChild(Mist);
SetPreview(Preview);
}
// Call after _Ready. Editing Preview during play does not call this method.
public void SetPreview(FogPreview mode)
{
var env = GalleryEnvironment;
env.FogEnabled = false;
env.VolumetricFogEnabled = true;
env.VolumetricFogLength = 60;
env.VolumetricFogDensity = mode is FogPreview.Global or FogPreview.Carve ? 0.02f : 0;
env.VolumetricFogAlbedo = new Color(0.62f, 0.69f, 0.78f);
env.VolumetricFogEmission = Colors.Black;
env.VolumetricFogAnisotropy = 0.3f;
env.VolumetricFogTemporalReprojectionEnabled = true;
env.VolumetricFogTemporalReprojectionAmount = 0.9f;
Mist.Visible = mode is FogPreview.Local or FogPreview.Carve;
MistMaterial.Density = mode == FogPreview.Carve ? -0.12f : 0.08f;
}
}Общий туман
Поднимайте плотность постепенно: слишком большая скрывает геометрию и превращает источники в яркие пятна. Albedo задаёт рассеяние света средой; итоговый цвет зависит и от освещения. Emission добавляет собственное свечение тумана, но не создаёт Light3D для соседних мешей.
VolumetricFogLength=60 ограничивает дальность расчёта тумана, а не дальность камеры. Увеличение дальности при том же объёмном буфере распределяет его детализацию на большее пространство. Сначала ограничьте дальность нужной областью, затем подбирайте разрешение тумана под целевую сцену.
Локальная область
В примере FogVolume находится в (0, 2.6, -10), Size=(10, 5, 10), Shape=Box. Size — полный размер по осям, не половина. Position и transform размещают область; HeightFalloff уменьшает плотность вверх по мировой Y относительно позиции объёма. EdgeFade смягчает границу формы. Другие формы доступны через RenderingServer.FogVolumeShape; World действует глобально и не ограничивается Size.
Назначайте FogMaterial или ShaderMaterial с shader_type fog. StandardMaterial3D предназначен для поверхности меша. Если несколько FogVolume используют один FogMaterial, изменение этого ресурса меняет все его применения; для независимых настроек создавайте отдельные материалы.
Нативная проверка подтвердила: Density=0 убирает локальный вклад, перенос объёма за пределы кадра убирает локальную дымку, VolumetricFogEnabled=false отключает и локальный объём. Нулевая общая плотность сама по себе локальный объём не выключает.
Ослабить туман в области
Отрицательная FogMaterial.Density уменьшает уже существующую плотность внутри формы. Она не делает геометрию прозрачной и не отключает физику. В режиме Carve тот же Box частично расчищает общий туман. Плотность на остальном пути от камеры до объекта остаётся: локальная расчистка не гарантирует полностью чистый вид сквозь всю сцену.
Убрать артефакты
| Проблема | Что проверить |
|---|---|
| FogVolume не виден | Forward+, действующий Environment, VolumetricFogEnabled, Material, положение, Size и Density |
| После Density=0 у Environment туман остался | Локальные FogVolume продолжают добавлять плотность |
| Изменение WorldEnvironment не действует | Environment активной Camera3D может перекрывать окружение мира |
| Видны ступени или грубые лучи | Уменьшить VolumetricFogLength; затем оценить volume_size/volume_depth и стоимость |
| За движущимся светом остаётся шлейф | Проверить temporal reprojection; уменьшить её вклад или сравнить с выключенной |
| При выключении reprojection появился шум | Это обмен накопления истории на текущий кадр; проверить движение и целевой GPU |
| Изменение материала затронуло другие области | Области используют один ресурс FogMaterial |
Для диагностики сначала меняйте один параметр. Temporal reprojection в примере включена с Amount=0.9; статический кадр не доказывает отсутствие шлейфов при движении.
Иллюстрации сняты текущим локальным runtime 1.0.0 в Forward+/Vulkan: 2560×1440, внутренний масштаб 1.5, MSAA 8×, TAA, одинаковые камера и экспозиция. Профиль предназначен для качественных иллюстраций, а не как обязательная настройка игры. Проверены перечисленные изменения плотности и объёма; анимированные 3D-текстуры, пользовательские fog-шейдеры и поведение в движении требуют отдельной проверки.