Files
HelloVulkan/Engine/include/Engine/Renderer/Passes/FullscreenGpu.h
T
atdunbg c75832e73e feat: RenderGraph 帧历史资源(ReadHistory)+ TemporalDiff 验证 pass
- PassBuilder::ReadHistory:读上一帧槽位 ((slot-1+F) mod F) 的物理镜像,
  TAA/运动模糊等时域效果的前置能力,RG 最后一个已知边界补齐
- 历史读不建拓扑边(跨帧依赖由同队列提交序保证)、不入本帧状态链、
  不改生命周期;剔除照常参与(生产者存活判定)
- 历史 barrier:首帧走 first(old=Undefined),之后走 steady 且
  src=ALL_COMMANDS|MEMORY_WRITE 显式闭合跨帧可用性+可见性;
  有历史读的资源,常规 entry steady 的 src 同样升级(历史读打破了
  同槽位 fence 全等保前提)
- TemporalDiff 调试 pass:|上一帧−当前帧|×增益,静止=黑/运动边缘发光
  即链路正确;Tonemap binding2 经 push 开关切调试视图
- 编译零错误、validation 零警告、8 秒冒烟通过(9 pass 全活跃)
2026-09-23 13:05:10 +08:00

81 lines
3.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/23.
//
// FullscreenGpu:全屏后处理共享装配(Tonemap/Bloom 系 pass 共用)。
//
// 全屏 pass 的共性收口在这里:Set0 = {输入0, 输入1}、push 16B 通用结构
// (规避 VUID-08878 的"range 定义必须一致")、无顶点输入全屏三角、
// 公共录制函数。新增全屏效果 = 复用本类 + 新增一个 frag shader。
//
#ifndef HELLOVULKAN_FULLSCREENGPU_H
#define HELLOVULKAN_FULLSCREENGPU_H
#include <Engine/Core/Types.h>
#include <Engine/RenderGraph/RenderGraph.h>
#include <vulkan/vulkan.hpp>
namespace Engine {
class Device;
class DescriptorManager;
class ShaderManager;
namespace Passes {
// 全屏 pass 通用 push(16B):所有全屏 pass 统一声明与推送
struct FullscreenPush {
f32 exposure;
f32 param0; // 各 pass 自定语义(tonemap: aces 开关)
f32 param1;
f32 param2;
};
// 后处理链参数(ImGui 可调;Renderer 持有,pass 按引用读取)
struct PostProcessParams {
f32 exposure = 1.0f;
bool useACES = true;
f32 bloomThreshold = 1.0f; // HDR 域亮度阈值
f32 bloomStrength = 0.8f; // 叠加强度
bool showTemporalDiff = false; // 调试视图:显示帧历史差异
};
class FullscreenGpu {
public:
FullscreenGpu(Device& device, DescriptorManager& descriptors,
ShaderManager& shaders);
~FullscreenGpu();
FullscreenGpu(const FullscreenGpu&) = delete;
FullscreenGpu& operator=(const FullscreenGpu&) = delete;
vk::DescriptorSetLayout setLayout; // Set0 = {输入0, 输入1, 调试输入}
vk::PipelineLayout layout; // push 16B(FullscreenPush)
vk::Sampler sampler;
vk::ShaderEXT vert{}, extractFrag{}, blurFrag{}, tonemapFrag{};
vk::ShaderEXT diffFrag{}; // temporal_diff(帧历史调试)
// 各 pass 自己持有 per-slot set;分配统一走这里
vk::DescriptorSet AllocateSet();
// 输入图片绑定(RG 重编译后重绑;物理镜像按槽位各一份)
void UpdateSetInput(vk::DescriptorSet set, u32 binding,
RG::RenderGraph& rg, RG::TextureHandle input,
u32 slot);
// 全屏 pass 公共录制:动态状态/draw 全一致,仅附件 view、
// 输入 set、push 值不同
void RecordFullscreen(RG::RenderGraphContext& ctx, vk::ImageView view,
vk::ShaderEXT frag, const vk::DescriptorSet& set,
const FullscreenPush& push);
private:
Device& m_Device;
DescriptorManager& m_Descriptors;
};
} // namespace Passes
} // namespace Engine
#endif //HELLOVULKAN_FULLSCREENGPU_H