Lighting Shadows
Система освещения
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)
// Настройка каскадных карт теней для направленного света
auto& dirLight = entity.getComponent<DirectionalLightComponent>();
dirLight.enableCascadedShadowMaps(true);
dirLight.setCascadeCount(4); // Количество каскадов
dirLight.setCascadeSplits({0.1f, 0.3f, 0.6f, 1.0f}); // Разделение каскадов
dirLight.setCascadeBlendWidth(0.05f); // Ширина смешивания между каскадами
// Настройка вариационных карт теней
auto& light = entity.getComponent<LightComponent>();
light.setShadowTechnique(ShadowTechnique::VarianceShadowMap);
light.setVarianceShadowBlurSize(3); // Размер размытия для VSM
light.setVarianceShadowLightBleedReduction(0.4f); // Уменьшение просачивания света
Оптимизация теней
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);
// Настройка Horizon-Based Ambient Occlusion
auto& postProcess = renderer.getPostProcessStack();
auto& hbao = postProcess.addEffect<HBAOEffect>();
hbao.setRadius(3.0f);
hbao.setBias(0.1f);
hbao.setMaxRadiusPixels(50.0f);
hbao.setIntensity(1.5f);
Отражения
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, рекомендуем: