Rendering Pipeline
Обзор
Wudgine использует современный графический конвейер на основе Vulkan, обеспечивающий высокую производительность и гибкость. Конвейер рендеринга состоит из нескольких этапов, каждый из которых отвечает за определенный аспект визуализации.
Этапы конвейера
Сбор геометрии
Сбор всех видимых объектов в сцене и их геометрии
Сортировка и группировка
Сортировка объектов по материалам и состояниям для минимизации переключений состояний
Рендеринг теней
Генерация карт теней для источников света
Геометрический проход
Рендеринг геометрии и материалов в G-буфер (позиция, нормали, альбедо, шероховатость и т.д.)
Освещение
Расчет освещения с использованием данных из G-буфера
Постобработка
Применение эффектов постобработки (bloom, тональная компрессия, цветокоррекция и т.д.)
Интерфейс
Рендеринг пользовательского интерфейса поверх сцены
Вывод на экран
Вывод финального изображения на экран
Отложенный рендеринг
Wudgine использует технику отложенного рендеринга (Deferred Rendering) для эффективной обработки большого количества источников света:
// Пример настройки отложенного рендеринга
RenderingPipeline pipeline;
// Настройка G-буфера
GBufferConfig gbufferConfig;
gbufferConfig.addRenderTarget(RenderTargetFormat::RGBA16F); // Позиция
gbufferConfig.addRenderTarget(RenderTargetFormat::RGBA16F); // Нормали
gbufferConfig.addRenderTarget(RenderTargetFormat::RGBA8); // Альбедо
gbufferConfig.addRenderTarget(RenderTargetFormat::RGBA8); // PBR параметры
gbufferConfig.setDepthStencilFormat(DepthStencilFormat::D24S8);
pipeline.setGBufferConfig(gbufferConfig);
// Добавление проходов рендеринга
pipeline.addPass<ShadowPass>();
pipeline.addPass<GeometryPass>();
pipeline.addPass<LightingPass>();
pipeline.addPass<SkyboxPass>();
pipeline.addPass<TransparencyPass>();
pipeline.addPass<PostProcessPass>();
pipeline.addPass<UIPass>();
// Инициализация конвейера
pipeline.initialize();
Физически корректный рендеринг (PBR)
Wudgine поддерживает физически корректный рендеринг для реалистичного отображения материалов:
Альбедо
Базовый цвет поверхности
Металличность
Определяет, является ли поверхность металлом или диэлектриком
Шероховатость
Микроскопические неровности поверхности
Нормали
Детализация поверхности без увеличения полигонов
Эмиссия
Самосвечение поверхности
Окклюзия
Затенение в углублениях и щелях
// Пример создания PBR материала
Material material;
material.setAlbedoTexture("assets/textures/metal/albedo.png");
material.setNormalTexture("assets/textures/metal/normal.png");
material.setMetallicTexture("assets/textures/metal/metallic.png");
material.setRoughnessTexture("assets/textures/metal/roughness.png");
material.setAoTexture("assets/textures/metal/ao.png");
// Установка параметров материала
material.setAlbedoFactor(Vector3(1.0f, 1.0f, 1.0f));
material.setMetallicFactor(1.0f);
material.setRoughnessFactor(0.5f);
Освещение
Wudgine поддерживает различные типы источников света:
// Создание направленного света
Entity lightEntity = world.createEntity();
auto& transform = lightEntity.addComponent<Transform>();
transform.setRotation(Quaternion::fromEulerAngles(-45.0f, 30.0f, 0.0f));
auto& directionalLight = lightEntity.addComponent<DirectionalLight>();
directionalLight.setColor(Vector3(1.0f, 0.95f, 0.9f));
directionalLight.setIntensity(5.0f);
directionalLight.setCastShadows(true);
directionalLight.setShadowResolution(2048);
// Создание точечного света
Entity lightEntity = world.createEntity();
auto& transform = lightEntity.addComponent<Transform>();
transform.setPosition(Vector3(0.0f, 2.0f, 0.0f));
auto& pointLight = lightEntity.addComponent<PointLight>();
pointLight.setColor(Vector3(1.0f, 0.8f, 0.6f));
pointLight.setIntensity(2.0f);
pointLight.setRadius(10.0f);
pointLight.setCastShadows(true);
// Создание прожектора
Entity lightEntity = world.createEntity();
auto& transform = lightEntity.addComponent<Transform>();
transform.setPosition(Vector3(0.0f, 3.0f, 0.0f));
transform.setRotation(Quaternion::fromEulerAngles(-90.0f, 0.0f, 0.0f));
auto& spotLight = lightEntity.addComponent<SpotLight>();
spotLight.setColor(Vector3(1.0f, 1.0f, 1.0f));
spotLight.setIntensity(3.0f);
spotLight.setRange(15.0f);
spotLight.setInnerAngle(20.0f);
spotLight.setOuterAngle(30.0f);
spotLight.setCastShadows(true);
Постобработка
Wudgine предоставляет широкий набор эффектов постобработки:
Bloom
Свечение ярких областей изображения
Тональная компрессия
Преобразование HDR в LDR с сохранением деталей
Цветокоррекция
Настройка цветов и контраста изображения
Глубина резкости
Размытие объектов вне фокуса
Размытие в движении
Эффект размытия при быстром движении
SSAO
Затенение в углублениях и щелях
// Пример настройки постобработки
PostProcessSettings settings;
// Bloom
settings.bloom.enabled = true;
settings.bloom.threshold = 1.0f;
settings.bloom.intensity = 0.5f;
// Тональная компрессия
settings.tonemap.enabled = true;
settings.tonemap.operator = TonemapOperator::ACES;
settings.tonemap.exposure = 1.0f;
// Цветокоррекция
settings.colorGrading.enabled = true;
settings.colorGrading.contrast = 1.1f;
settings.colorGrading.saturation = 1.05f;
settings.colorGrading.gamma = Vector3(1.0f, 1.0f, 1.0f);
settings.colorGrading.lutTexture = "assets/textures/lut/cinematic.png";
// Применение настроек
renderer.setPostProcessSettings(settings);
Оптимизация
Wudgine использует различные техники оптимизации рендеринга:
- Отсечение невидимых объектов: Hierarchical Z-Buffer, Occlusion Culling
- Уровни детализации (LOD): автоматическое снижение детализации удаленных объектов
- Инстансинг: эффективный рендеринг множества одинаковых объектов
- Многопоточная подготовка команд: распараллеливание подготовки команд рендеринга
- Асинхронные вычисления: использование compute shaders для параллельных вычислений
// Пример настройки LOD для модели
Model model = resourceManager.loadModel("assets/models/tree.fbx");
model.setLodLevels({
{ 0.0f, "assets/models/tree_lod0.fbx" },
{ 10.0f, "assets/models/tree_lod1.fbx" },
{ 30.0f, "assets/models/tree_lod2.fbx" },
{ 100.0f, "assets/models/tree_lod3.fbx" }
});
Следующие шаги
Теперь, когда вы ознакомились с конвейером рендеринга Wudgine, рекомендуем: