Environment: фон, ambient, SSAO и glow
Выбрать окружение камеры и мира, запустить контролируемое сравнение эффектов в текущем Compatibility.
Готовая сцена
Скачать проект галереи. Нужны Reckfell 1.0.0 с C# SDK и Forward+/Vulkan. Откройте project.reckfell, соберите C# и запустите Main.rscene. Готовый интерьер Pawn Shop создан James Ray Cock и Rico Cilliers для Poly Haven и распространяется по CC0. Архитектура, мебель, растения и предметы взяты из этой сцены; материалы и свет адаптированы для Reckfell. Все ресурсы и сведения об авторах включены в Assets. Окружение за окнами — Kloofendal 48d Partly Cloudy Pure Sky, Poly Haven, CC0.
Кадр снят в 2560×1440, внутренний рендер — 3840×2160: Scaling3DScale=1.5, MSAA 8×, TAA, атлас теней 4096. В сцене настроены ACES, SDFGI, SSAO, glow, SSR и объёмный туман. Это тяжёлый профиль для иллюстраций; для игры подбирайте разрешение и эффекты под целевое устройство. Само включение свойства не подтверждает качество эффекта или скорость на другом GPU.
В сравнениях ниже сохраняются камера, геометрия, материалы, экспозиция и сглаживание. Меняется только указанный параметр. Простой C#-стенд далее нужен для изолированной проверки поведения; он не является сценой на иллюстрациях.
Назначить окружение
Environment — ресурс настроек, а не Entity и не источник света сам по себе. Он действует после назначения WorldEnvironment.Environment или Camera3D.Environment.
Приоритет: окружение активной камеры, затем окружение её World3D, затем доступное fallback-окружение. Camera3D.Environment=null снимает override. Если правка WorldEnvironment ничего не меняет, сначала проверьте активную камеру.
Правило «один WorldEnvironment» относится к одному миру. В одном EntityTree могут быть независимые SubViewport с собственными World3D и разными окружениями — это проверено в runtime. Несколько WorldEnvironment в одном мире не смешиваются автоматически: используется первый зарегистрированный.
Запустить три режима
Сохраните LightingMaterials.cs из материалов, LightingLab3D.cs из освещения и EnvironmentLab3D.cs ниже. Нужны C# SDK 1.0.0 и net10.0. Выполните dotnet build и назначьте EnvironmentLab3D.cs Entity3D-корню .rscene вместо LightingLab3D.cs.
До запуска выберите экспортированное Preview: Lighting, AmbientOcclusion или Glow. EffectEnabled выбирает состояние эффекта. Экспортированные значения читаются в _Ready; изменение их во время игры само по себе не вызывает повторную настройку. Из работающего кода после _Ready доступны ShowAmbientOcclusion(bool) и ShowGlow(bool).
EnvironmentLab3D.cs
using Reckfell;
public partial class EnvironmentLab3D : LightingLab3D
{
public enum PreviewMode { Lighting, AmbientOcclusion, Glow }
[Export] public PreviewMode Preview { get; set; } = PreviewMode.Lighting;
[Export] public bool EffectEnabled { get; set; } = true;
private MeshInstance3D? emitter;
public override void _Ready()
{
base._Ready();
if (Preview == PreviewMode.AmbientOcclusion) ShowAmbientOcclusion(EffectEnabled);
if (Preview == PreviewMode.Glow) ShowGlow(EffectEnabled);
}
public void ShowAmbientOcclusion(bool enabled)
{
Key.Visible = false; Point.Visible = false; Spot.Visible = false;
Floor.Visible = true; Cube.Visible = true; MetalSphere.Visible = true;
if (emitter != null) emitter.Visible = false;
var env = World.Environment;
env.BackgroundColor = new Color(0.025f, 0.03f, 0.045f);
env.AmbientLightEnergy = 1;
env.FogEnabled = false; env.GlowEnabled = false;
env.SsaoEnabled = true;
env.SsaoRadius = 2;
env.SsaoIntensity = enabled ? 3 : 0;
}
public void ShowGlow(bool enabled)
{
Key.Visible = false; Point.Visible = false; Spot.Visible = false;
Floor.Visible = false; Cube.Visible = false; MetalSphere.Visible = false;
var env = World.Environment;
env.BackgroundColor = Colors.Black;
env.AmbientLightEnergy = 0;
env.SsaoEnabled = false; env.FogEnabled = false;
env.GlowIntensity = 1.5f;
env.GlowBloom = 0.1f;
env.GlowHdrThreshold = 0.8f;
env.GlowEnabled = enabled;
if (emitter == null)
{
var material = LightingMaterials.Surface(Colors.Black);
material.EmissionEnabled = true;
material.Emission = Colors.White;
material.EmissionEnergyMultiplier = 8;
emitter = new MeshInstance3D
{
Mesh = new BoxMesh { Size = Vector3.One },
Position = new Vector3(0, 0.7f, 0),
MaterialOverride = material
};
AddChild(emitter);
}
emitter.Visible = true;
}
}Разделить фон, ambient и отражения
| Настройка | За что отвечает |
|---|---|
| BackgroundMode и BackgroundColor | Что видно за геометрией |
| AmbientLightSource, AmbientLightColor, AmbientLightEnergy | Общее освещение поверхностей |
| ReflectedLightSource | Источник отражений окружения |
| TonemapMode и экспозиция | Преобразование яркости при выводе |
Цветной фон не гарантирует освещённый куб. Пример явно выбирает ambient из Color, а отражение окружения отключает. Установка Camera.Environment с другим фоном перекрыла WorldEnvironment; сброс в null вернул фон мира.
Начинайте с предсказуемых материалов и одного света. Затем подбирайте tone mapping/экспозицию и эффекты. В этом сравнении TonemapMode=Linear не меняется; одинаковые численные настройки разных renderer не обещают одинаковый кадр.
SSAO: контактное затемнение
В режиме AmbientOcclusion прямые источники выключены, ambient energy=1, SsaoRadius=2. При EffectEnabled=false SSAO остаётся включённым, но SsaoIntensity=0; при true интенсивность равна 3. Это контролируемое сравнение одного post-processing пути, а не двух разных способов вывода.
На иллюстрациях — галерея Forward+: SsaoEnabled=true в обоих кадрах, SsaoIntensity=0/1.6. В C#-стенде выше используются отдельные значения 0/3.
Сравнение подтвердило локальное затемнение около геометрии при неизменном фоне. Значения 2/3 усилены для демонстрации, а не рекомендуются для любой игры.
Текущий Compatibility имеет базовую реализацию SSAO с Radius/Intensity. В исходниках радиус и интенсивность масштабируются иначе, чем в другом пути рендеринга; расширенные параметры Forward+ здесь не следует считать эквивалентными. SSAO использует видимую глубину, не создаёт физическую тень и не видит весь мир за пределами кадра.
Glow: ореол яркого объекта
Режим Glow скрывает пол, куб и шар, выключает источники и показывает отдельный emissive-меш на чёрном фоне. EmissionEnergyMultiplier=8; glow использует Intensity=1.5, Bloom=0.1, HdrThreshold=0.8.
Иллюстрации показывают галерею Forward+: GlowEnabled=false/true, GlowIntensity=0.55, GlowBloom=0.03. Геометрия и экспозиция не меняются.
Проверка подтверждает реальный ореол в текущем OpenGL runtime. Отдельные glow levels, blend/map и настройки качества зависят от renderer; пример их не проверяет. Glow не освещает соседнюю геометрию. Слишком сильный bloom снижает контраст, поэтому эффект настраивайте после экспозиции и яркости источника.
Туман и другие эффекты
FogEnabled включает обычный туман; изменение FogDensity с 0 до 0.15 проверено отдельно при уже включённом режиме. VolumetricFogEnabled — другой механизм, не подтверждённый этим примером. Установка bool-свойства сама по себе не доказывает, что конкретный renderer реализует эффект.
SSIL, SSR, GI, отражения, объёмный туман и compositor требуют отдельных настроек и проверки целевой конфигурации. Не включайте всё одновременно для исправления одной проблемы света. Если нужен более чёткий контакт — проверьте геометрию и источник, затем SSAO; если нужен перенос света между поверхностями — это отдельная задача непрямого освещения.
Диагностика
| Проблема | Проверка |
|---|---|
| Правки мира не видны | Camera3D.Environment и фактический World3D viewport |
| Есть фон, всё остальное чёрное | AmbientLightSource/energy и реальные Light3D |
| SSAO будто меняет всю картинку | Сравнивать одинаковый активный путь при интенсивности 0/нужном значении |
| Glow отсутствует | EmissionEnabled, яркость/экспозиция, порог и назначенное окружение |
| Glow не освещает соседей | Нужен Light3D или отдельное непрямое освещение |
| Переключение Preview в игре не сработало | Оно читается при _Ready; вызвать публичный метод настройки |
Иллюстрации — реальные кадры текущей локальной сборки 1.0.0 в Forward+/Vulkan, 2560×1440. Поведение простого C#-стенда отдельно проверено в Compatibility/OpenGL. Это разные сцены, не сравнение renderer, производительности или интерфейса редактора.