Lighting Shadows

В этом разделе описывается система освещения и теней Wudgine.

Система освещения

Wudgine предлагает гибкую систему освещения, поддерживающую различные типы источников света и современные техники освещения.

Типы источников света

Направленный свет

Имитирует свет от удаленного источника, например солнца. Все лучи параллельны и имеют одинаковое направление.

Точечный свет

Излучает свет во всех направлениях из одной точки. Интенсивность уменьшается с расстоянием.

Прожектор

Излучает свет в форме конуса. Имеет настраиваемый угол и резкость краев.

Прямоугольный свет

Излучает свет с прямоугольной поверхности. Используется для имитации окон, световых панелей и т.д.

Создание источников света

// Создание направленного света
Entity sunLight = scene.createEntity("SunLight");
auto& dirLight = sunLight.addComponent<DirectionalLightComponent>();
dirLight.setDirection(Vector3(-0.5f, -1.0f, -0.3f));
dirLight.setColor(Vector3(1.0f, 0.95f, 0.9f));
dirLight.setIntensity(5.0f);
dirLight.setCastShadows(true);
dirLight.setShadowMapSize(2048);

// Создание точечного света
Entity pointLight = scene.createEntity("PointLight");
auto& pointLightComp = pointLight.addComponent<PointLightComponent>();
pointLightComp.setPosition(Vector3(0.0f, 2.0f, 0.0f));
pointLightComp.setColor(Vector3(1.0f, 0.7f, 0.3f));
pointLightComp.setIntensity(2.0f);
pointLightComp.setRadius(10.0f);
pointLightComp.setCastShadows(true);

// Создание прожектора
Entity spotLight = scene.createEntity("SpotLight");
auto& spotLightComp = spotLight.addComponent<SpotLightComponent>();
spotLightComp.setPosition(Vector3(0.0f, 5.0f, 0.0f));
spotLightComp.setDirection(Vector3(0.0f, -1.0f, 0.0f));
spotLightComp.setColor(Vector3(0.2f, 0.4f, 1.0f));
spotLightComp.setIntensity(3.0f);
spotLightComp.setRange(15.0f);
spotLightComp.setInnerAngle(20.0f);
spotLightComp.setOuterAngle(30.0f);
spotLightComp.setCastShadows(true);

Физически корректное освещение

Wudgine использует физически корректную модель освещения (PBR), которая реалистично симулирует взаимодействие света с поверхностями:

  • Энергосохраняющая модель BRDF (Bidirectional Reflectance Distribution Function)
  • Микрофасетная модель для расчета шероховатости поверхности
  • Разделение на диффузное и зеркальное отражение
  • Учет металличности материала
  • Линейное цветовое пространство для расчетов освещения

Система теней

Техники теней

Wudgine поддерживает несколько техник рендеринга теней:

// Настройка карт теней для направленного света
auto& dirLight = entity.getComponent<DirectionalLightComponent>();
dirLight.setShadowMapSize(2048); // Размер текстуры карты теней
dirLight.setShadowBias(0.0005f); // Смещение для предотвращения акне теней
dirLight.setShadowNormalBias(0.01f); // Смещение по нормали
dirLight.setShadowSoftness(2.0f); // Мягкость краев теней (PCF)

Оптимизация теней

Wudgine предлагает различные методы оптимизации теней:

  • Автоматический выбор разрешения карт теней в зависимости от расстояния
  • Отсечение теней за пределами видимости камеры
  • Стабилизация теней для предотвращения мерцания
  • Фильтрация теней для улучшения качества
  • Кэширование теней для статических объектов

Глобальное освещение

Ambient Occlusion

Wudgine поддерживает несколько техник затенения окружения:

// Настройка Screen Space Ambient Occlusion
auto& postProcess = renderer.getPostProcessStack();
auto& ssao = postProcess.addEffect<SSAOEffect>();
ssao.setRadius(0.5f);
ssao.setSampleCount(16);
ssao.setPower(2.0f);
ssao.setBias(0.025f);

Отражения

Wudgine предлагает различные техники для создания реалистичных отражений:

  • Screen Space Reflections (SSR)
  • Planar Reflections для плоских отражающих поверхностей
  • Cubemap Reflections для статических отражений окружения
  • Reflection Probes для локальных отражений
// Создание зонда отражений
Entity reflectionProbe = scene.createEntity("ReflectionProbe");
auto& probe = reflectionProbe.addComponent<ReflectionProbeComponent>();
probe.setPosition(Vector3(0.0f, 2.0f, 0.0f));
probe.setRadius(10.0f);
probe.setResolution(256);
probe.setUpdateMode(ReflectionProbeUpdateMode::OnDemand);
probe.update(); // Обновление зонда отражений

Global Illumination

Wudgine поддерживает несколько техник глобального освещения:

Light Probes

Захватывают непрямое освещение в определенных точках сцены для динамических объектов.

Lightmaps

Предварительно рассчитанное освещение для статических объектов, сохраненное в текстурах.

SVOGI

Sparse Voxel Octree Global Illumination для динамического глобального освещения.

SSGI

Screen Space Global Illumination для приближенного расчета непрямого освещения.

Примеры настройки освещения

Дневная сцена

// Настройка дневного освещения
Entity sun = scene.createEntity("Sun");
auto& sunLight = sun.addComponent<DirectionalLightComponent>();
sunLight.setDirection(Vector3(-0.3f, -0.8f, -0.5f));
sunLight.setColor(Vector3(1.0f, 0.98f, 0.95f));
sunLight.setIntensity(5.0f);
sunLight.setCastShadows(true);
sunLight.enableCascadedShadowMaps(true);

// Настройка окружающего освещения (небо)
scene.setAmbientLight(Vector3(0.6f, 0.7f, 1.0f), 0.3f);

// Добавление отражений неба
scene.setSkybox("assets/textures/skies/day_sky.hdr");

Ночная сцена

// Настройка ночного освещения
Entity moon = scene.createEntity("Moon");
auto& moonLight = moon.addComponent<DirectionalLightComponent>();
moonLight.setDirection(Vector3(-0.2f, -0.9f, -0.3f));
moonLight.setColor(Vector3(0.8f, 0.85f, 1.0f));
moonLight.setIntensity(0.5f);
moonLight.setCastShadows(true);

// Уличный фонарь
Entity streetLight = scene.createEntity("StreetLight");
auto& streetLightComp = streetLight.addComponent<SpotLightComponent>();
streetLightComp.setPosition(Vector3(0.0f, 5.0f, 0.0f));
streetLightComp.setDirection(Vector3(0.0f, -1.0f, 0.0f));
streetLightComp.setColor(Vector3(1.0f, 0.9f, 0.7f));
streetLightComp.setIntensity(2.0f);
streetLightComp.setRange(10.0f);
streetLightComp.setInnerAngle(30.0f);
streetLightComp.setOuterAngle(45.0f);
streetLightComp.setCastShadows(true);

// Настройка окружающего освещения (ночное небо)
scene.setAmbientLight(Vector3(0.1f, 0.1f, 0.2f), 0.1f);

// Добавление отражений ночного неба
scene.setSkybox("assets/textures/skies/night_sky.hdr");

Следующие шаги

Теперь, когда вы ознакомились с системой освещения и теней Wudgine, рекомендуем:

Постобработка

Изучите эффекты постобработки для улучшения визуального качества.

Оптимизация рендеринга

Узнайте о методах оптимизации рендеринга для повышения производительности.

Wudgine • © 2025