- 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)
112 lines
4.0 KiB
C++
112 lines
4.0 KiB
C++
//
|
||
// 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
|