- Velocity buffer:Forward 第二颜色附件,vertex 计算 clip 空间运动向量 (UBO 尾部追加 projNoJitter/prevView/prevProj;上一帧实例矩阵 SSBO Set0 binding2,与当前实例数组平行对齐——转动的物体速度正确不鬼影) - 子像素抖动:SceneRenderer Halton(2,3)×8 序列,抖动只进光栅化投影 - TAA resolve pass:velocity 反推历史位置 + 3×3 邻域 clamp 去鬼影 + mix(cur,hist,0.9) 时域累积;TAAColor 自引用历史 - RG 历史读补 post-barrier:采样后恢复镜像 resting layout(TAA 的历史 是 ColorAttachment layout,不恢复则下帧 entry oldLayout 脱节) - 管线:Forward(HDR+Velocity) → TAA(TAAColor) → Bloom/Tonemap 改源 TAAColor - 编译零错误、validation 零警告、8 秒冒烟通过(10 pass 全活跃)
69 lines
2.4 KiB
C++
69 lines
2.4 KiB
C++
//
|
||
// Created by atdunbg on 2026/9/23.
|
||
//
|
||
// SceneGpu:场景级 GPU 共享装配(Shadow/Forward 及未来几何类 pass 共用)。
|
||
//
|
||
// 从 Renderer 拆出的装配体:set 布局 / pipeline 布局 / shader object /
|
||
// 采样器 / per-slot 描述符集合。新增几何 pass(延迟、调试线框等)直接
|
||
// 复用本装配,不必碰 Renderer。
|
||
//
|
||
|
||
#ifndef HELLOVULKAN_SCENEGPU_H
|
||
#define HELLOVULKAN_SCENEGPU_H
|
||
|
||
#include <Engine/Core/FrameContext.h>
|
||
#include <Engine/RenderGraph/RenderGraph.h>
|
||
#include <vulkan/vulkan.hpp>
|
||
#include <vector>
|
||
|
||
namespace Engine {
|
||
|
||
class Device;
|
||
class DescriptorManager;
|
||
class ShaderManager;
|
||
class UniformBuffer;
|
||
|
||
namespace Passes {
|
||
|
||
class SceneGpu {
|
||
public:
|
||
SceneGpu(Device& device, DescriptorManager& descriptors,
|
||
ShaderManager& shaders,
|
||
UniformBuffer& ubo, UniformBuffer& objectBuffer,
|
||
UniformBuffer& prevObjectBuffer);
|
||
~SceneGpu();
|
||
|
||
SceneGpu(const SceneGpu&) = delete;
|
||
SceneGpu& operator=(const SceneGpu&) = delete;
|
||
|
||
// ---- set 布局(shader 契约,改绑定必须同步 shaders/)----
|
||
vk::DescriptorSetLayout uboSetLayout; // Set0 = {UBO, ObjectBuffer, PrevObjectBuffer}
|
||
vk::DescriptorSetLayout textureSetLayout; // Set1 = {albedo}
|
||
vk::DescriptorSetLayout shadowSetLayout; // Set2 = {shadow map}
|
||
vk::PipelineLayout forwardLayout; // 3 sets,无 push(GPUDriven 经 SSBO)
|
||
vk::PipelineLayout shadowLayout; // Set0,push = lightVP 64B
|
||
|
||
// per-slot 描述符:Set0(UBO+实例 SSBO)与 Set2(阴影图采样)
|
||
std::vector<vk::DescriptorSet> uboSets;
|
||
std::vector<vk::DescriptorSet> shadowSets;
|
||
|
||
// 阴影采样器:clamp-to-border 白色 = 光视锥外自动无阴影
|
||
//(省 shader 出界分支)
|
||
vk::Sampler shadowSampler;
|
||
|
||
vk::ShaderEXT forwardVert{}, forwardFrag{};
|
||
vk::ShaderEXT shadowVert{}, shadowFrag{};
|
||
|
||
// RG 重编译后重绑阴影图(物理镜像按槽位各一份)
|
||
void BindShadowMap(RG::RenderGraph& rg, RG::TextureHandle shadowMap);
|
||
|
||
private:
|
||
Device& m_Device;
|
||
DescriptorManager& m_Descriptors;
|
||
};
|
||
|
||
} // namespace Passes
|
||
} // namespace Engine
|
||
|
||
#endif //HELLOVULKAN_SCENEGPU_H
|