Rendering Pipeline

В этом разделе описывается графический конвейер Wudgine, основанный на Vulkan.

Обзор

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);

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

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, рекомендуем:

Материалы и шейдеры

Изучите систему материалов и шейдеров Wudgine.

Освещение и тени

Познакомьтесь с системой освещения и теней.

Wudgine • © 2025