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 全活跃)
This commit is contained in:
@@ -16,6 +16,7 @@
|
||||
#include <Engine/Renderer/Passes/ForwardPass.h>
|
||||
#include <Engine/Renderer/Passes/BloomPass.h>
|
||||
#include <Engine/Renderer/Passes/TonemapPass.h>
|
||||
#include <Engine/Renderer/Passes/TemporalDiffPass.h>
|
||||
#include <Engine/Renderer/Passes/ImGuiPass.h>
|
||||
#include <Engine/Renderer/Passes/PresentPass.h>
|
||||
#include <Engine/Vulkan/Device.h>
|
||||
@@ -143,6 +144,8 @@ namespace Engine
|
||||
void Renderer::SetBloomThreshold(f32 v) { m_PostParams->bloomThreshold = v; }
|
||||
f32 Renderer::GetBloomStrength() const { return m_PostParams->bloomStrength; }
|
||||
void Renderer::SetBloomStrength(f32 v) { m_PostParams->bloomStrength = v; }
|
||||
bool Renderer::GetShowTemporalDiff() const { return m_PostParams->showTemporalDiff; }
|
||||
void Renderer::SetShowTemporalDiff(bool b) { m_PostParams->showTemporalDiff = b; }
|
||||
|
||||
u32 Renderer::GetMainInstanceCount() const
|
||||
{
|
||||
@@ -194,6 +197,12 @@ namespace Engine
|
||||
"BloomB",
|
||||
RG::TextureDesc{vk::Format::eR16G16B16A16Sfloat, 0, 0, 0.5f});
|
||||
|
||||
// 帧历史差异(调试视图):|上一帧 − 当前帧| × 增益。
|
||||
// 帧历史机制(ReadHistory)的验证消费端,也是 TAA 的参考形态
|
||||
m_TemporalDiff = m_RenderGraph->CreateTexture(
|
||||
"TemporalDiff",
|
||||
RG::TextureDesc{vk::Format::eR16G16B16A16Sfloat, 0, 0, 0.5f});
|
||||
|
||||
// ---- pass 注册:执行序由拓扑排序决定,与注册顺序无关 ----
|
||||
// 要加新 pass:new 一个 RenderPass 子类,在这里 push 一行。
|
||||
FrameSceneData& frame = m_SceneRenderer->Frame();
|
||||
@@ -201,10 +210,13 @@ namespace Engine
|
||||
*m_SceneGpu, frame, m_ShadowMap));
|
||||
m_Passes.push_back(CreateScope<Passes::ForwardPass>(
|
||||
*m_SceneGpu, frame, m_HDRColor, m_Depth, m_ShadowMap));
|
||||
m_Passes.push_back(CreateScope<Passes::TemporalDiffPass>(
|
||||
*m_FullscreenGpu, /*gain*/ 8.0f, m_HDRColor, m_TemporalDiff));
|
||||
m_Passes.push_back(CreateScope<Passes::BloomPass>(
|
||||
*m_FullscreenGpu, *m_PostParams, m_HDRColor, m_BloomA, m_BloomB));
|
||||
m_Passes.push_back(CreateScope<Passes::TonemapPass>(
|
||||
*m_FullscreenGpu, *m_PostParams, m_HDRColor, m_BloomA, m_Backbuffer));
|
||||
*m_FullscreenGpu, *m_PostParams, m_HDRColor, m_BloomA,
|
||||
m_TemporalDiff, m_Backbuffer));
|
||||
m_Passes.push_back(CreateScope<Passes::ImGuiPass>(
|
||||
&m_ImGuiLayer, m_Backbuffer));
|
||||
m_Passes.push_back(CreateScope<Passes::PresentPass>(m_Backbuffer));
|
||||
|
||||
Reference in New Issue
Block a user