Files
HelloVulkan/Engine/include/Engine/Renderer/Renderer.h
T
atdunbg d55f644b68 feat: Shadow pass——主光方向光阴影(RenderGraph 双 pass 管线首个验证案例)
- RenderGraph 声明 ShadowMap 虚拟资源(D32,2048²固定分辨率,独立于
  swapchain 尺寸),Shadow pass 写深度 → Forward 声明 ShaderRead 采样,
  barrier/layout(DepthAttachment→ShaderReadOnly)全部由图自动预算
- Shadow pass:空 fragment shader + 深度偏移(斜率缩放)抗 shadow acne
- Forward:UBO 增加 lightSpace 矩阵;Set 2 采样阴影图,手动对比 +
  斜率缩放偏差;clamp-to-border 白色边界(光视锥外 = 全亮)
- 光空间矩阵:主光方向反推 30 单位正交盒;深度重映射 [-1,1]→[0,1]
- GetPhysicalView(slot):物理镜像按帧槽位隔离,描述符 Compile 后一次性写入
- 修复 RG 隐蔽 bug:ShaderStage 与 PipelineStage2 位值不同
  (eFragment=0x10 vs eFragmentShader=0x80),位值直转会撞出
  TESSELLATION_CONTROL stage;改为逐位显式映射
- 修复 Camera 投影深度未重映射到 [0,1] 的潜在裁剪问题

validation 零错误零警告(3 passes / 5 barriers / 4 gpu images)
2026-09-22 14:30:50 +08:00

112 lines
4.0 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
//
// Created by atdunbg on 2026/9/20.
//
#ifndef HELLOVULKAN_RENDERER_H
#define HELLOVULKAN_RENDERER_H
#pragma once
#include <Engine/Core/Types.h>
#include <Engine/Core/FrameContext.h>
#include <Engine/RenderGraph/RenderGraph.h>
#include <vulkan/vulkan.hpp>
#include <vector>
#include <glm/glm.hpp>
namespace Engine {
class Window;
class Device;
class MemoryAllocator;
class DescriptorManager;
class ShaderManager;
class Swapchain;
class SyncManager;
class CommandManager;
class UniformBuffer;
class Model;
namespace ECS { class Scene; }
namespace Assets { class AssetManager; }
// Renderer 职责(收敛后):
// 1. 装配底层模块(Device/Swapchain/Sync/Command/Descriptor/Shader)
// 2. 声明并驱动 RenderGraph(pass 结构在这里组装)
// 3. Render(Scene&, AssetManager&):从 ECS 场景读取相机/灯光/渲染体,
// 经资产层解析句柄后绘制
// 不拥有场景,不加载资产(资产归 AssetManager,磁盘 IO 与这里无关)。
class Renderer {
public:
Renderer(Window& window);
~Renderer();
Renderer(const Renderer&) = delete;
Renderer& operator=(const Renderer&) = delete;
void Render(ECS::Scene& scene, Assets::AssetManager& assets);
// ---- 组合根(Application)装配其他模块时需要的访问器 ----
Device& GetDevice() const { return *m_Device; }
MemoryAllocator& GetAllocator() const { return *m_Allocator; }
DescriptorManager& GetDescriptorManager() const { return *m_DescriptorManager; }
vk::DescriptorSetLayout GetTextureSetLayout() const { return m_TextureSetLayout; }
private:
void BuildGraph(); // 声明 pass 结构 + 首次 Compile
void HandleResize();
void UpdateShadowDescriptors(); // Compile 后把阴影深度图物理视图写进 Set 2
Window& m_Window;
// ---- 底层模块(析构序:后声明者先析构,RG 在 Device/Allocator 之前)----
Scope<Device> m_Device;
Scope<MemoryAllocator> m_Allocator;
Scope<DescriptorManager> m_DescriptorManager;
Scope<ShaderManager> m_ShaderManager;
Scope<Swapchain> m_Swapchain;
Scope<SyncManager> m_SyncManager;
Scope<CommandManager> m_CommandManager;
Scope<UniformBuffer> m_UniformBuffer;
Scope<RG::RenderGraph> m_RenderGraph;
// ---- 管线装配(shader object 方案,无 vk::Pipeline)----
vk::PipelineLayout m_PipelineLayout;
vk::DescriptorSetLayout m_UBOSetLayout;
vk::DescriptorSetLayout m_TextureSetLayout;
std::vector<vk::DescriptorSet> m_UBODescriptorSets; // 每帧槽位一个
vk::ShaderEXT m_VertShader{};
vk::ShaderEXT m_FragShader{};
// ---- 阴影 ----
// Shadow pass 只绑定顶点 shader(深度写入,无颜色输出),
// 独立 pipeline layout:空描述符 + 128B push(lightVP + model)
vk::PipelineLayout m_ShadowPipelineLayout;
vk::ShaderEXT m_ShadowVertShader{};
vk::ShaderEXT m_ShadowFragShader{};
// Set 2:阴影深度图采样。每槽位一组描述符,Compile 后用
// GetPhysicalView(slot) 一次性写入(物理镜像按槽位隔离,无需每帧更新)
vk::DescriptorSetLayout m_ShadowSetLayout;
vk::Sampler m_ShadowSampler;
std::vector<vk::DescriptorSet> m_ShadowDescriptorSets; // 每帧槽位一个
glm::mat4 m_LightSpaceMatrix{1.0f}; // 每帧按主光方向重算
// ---- RenderGraph 资源句柄 ----
RG::TextureHandle m_Backbuffer{};
RG::TextureHandle m_Depth{};
RG::TextureHandle m_ShadowMap{};
// ---- 当帧绑定(Render() 期间有效,供 pass 回调读取)----
ECS::Scene* m_BoundScene = nullptr;
Assets::AssetManager* m_BoundAssets = nullptr;
vk::Extent2D m_Extent{};
u32 m_CurrentFrame = 0;
};
} // namespace Engine
#endif //HELLOVULKAN_RENDERER_H