- 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 全活跃)
81 lines
3.0 KiB
C++
81 lines
3.0 KiB
C++
//
|
||
// 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
|