三个运行时开关(Shadows/TAA/Bloom)与 9 种调试视图(Final/ TemporalDiff/HDR/TAAColor/Bloom/Velocity/ShadowMap0-2)。 统一设计:开关状态收敛 FrameSceneData 契约,SceneRenderer 唯一 写入、各 pass 只读(零虚接口路由);调试视图经 tonemap push int 路由已绑定的中间目标(声明超集、运行时零重绑);HDR 域 资源过同一 tonemap 保证观感可比。 - Shadows:ShadowPass lambda 空转 + frag cascadeSplits.w 短路 - TAA:alpha=0 直通 + SceneRenderer 停投影抖动(同一持有者同步) - Bloom:3 子 pass 空转 + tonemap 强度归零 - Renderer 门面 Get/Set 转发,App ImGui 3 Checkbox + Combo - PostProcessParams 瘦身为纯数值参数,showTemporalDiff 被取缔
55 lines
2.2 KiB
C++
55 lines
2.2 KiB
C++
//
|
|
// Created by atdunbg on 2026/9/23.
|
|
//
|
|
|
|
#include <Engine/Renderer/Passes/TAAPass.h>
|
|
#include <Engine/Core/FrameContext.h>
|
|
|
|
namespace Engine::Passes
|
|
{
|
|
TAAPass::TAAPass(FullscreenGpu& gpu, FrameSceneData& frame, f32 historyAlpha,
|
|
RG::TextureHandle hdrColor, RG::TextureHandle velocity,
|
|
RG::TextureHandle taaColor)
|
|
: m_Gpu(gpu), m_Frame(frame), m_HistoryAlpha(historyAlpha),
|
|
m_HDR(hdrColor), m_Velocity(velocity), m_TAAColor(taaColor)
|
|
{
|
|
m_Sets.resize(kMaxFramesInFlight);
|
|
for (u32 slot = 0; slot < kMaxFramesInFlight; ++slot) {
|
|
m_Sets[slot] = m_Gpu.AllocateSet();
|
|
}
|
|
}
|
|
|
|
void TAAPass::Register(RG::RenderGraph& rg)
|
|
{
|
|
rg.AddPass("TAA",
|
|
[this](RG::RenderGraphContext& ctx) {
|
|
// TAA 关闭:alpha=0 → mix(cur, hist, 0) 直通当前帧
|
|
//(抖动已由 SceneRenderer 同步停掉,画面静止无锯齿晃动)
|
|
const f32 alpha = m_Frame.taaEnabled ? m_HistoryAlpha : 0.0f;
|
|
m_Gpu.RecordFullscreen(ctx, ctx.View(m_TAAColor), m_Gpu.taaFrag,
|
|
m_Sets[ctx.frame.frameSlot],
|
|
FullscreenPush{0.0f, alpha, 0.0f, 0.0f});
|
|
})
|
|
.Read(m_HDR, RG::ResourceUse::ShaderRead,
|
|
vk::ShaderStageFlagBits::eFragment)
|
|
.Read(m_Velocity, RG::ResourceUse::ShaderRead,
|
|
vk::ShaderStageFlagBits::eFragment)
|
|
// 自引用历史:TAAColor 的上一帧槽位就是累积历史
|
|
.ReadHistory(m_TAAColor, RG::ResourceUse::ShaderRead,
|
|
vk::ShaderStageFlagBits::eFragment)
|
|
.Write(m_TAAColor, RG::ResourceUse::ColorAttachment);
|
|
}
|
|
|
|
void TAAPass::OnTargetsRebuilt(RG::RenderGraph& rg)
|
|
{
|
|
for (u32 slot = 0; slot < kMaxFramesInFlight; ++slot) {
|
|
m_Gpu.UpdateSetInput(m_Sets[slot], 0, rg, m_HDR, slot);
|
|
m_Gpu.UpdateSetInput(m_Sets[slot], 1, rg, m_Velocity, slot);
|
|
// binding2 = 历史(上一帧槽位镜像)
|
|
m_Gpu.UpdateSetInput(m_Sets[slot], 2, rg, m_TAAColor,
|
|
rg.HistorySlot(slot));
|
|
}
|
|
}
|
|
|
|
} // namespace Engine::Passes
|