feat: HDR 管线 + Tonemap pass,显示变换显式建模
管线:Shadow → Forward(写 HDRColor R16G16B16A16F) → Tonemap → ImGui(loadOp=Load) → Present。对齐 UE/Unity 结构:场景线性值 进 HDR 离屏图,Tonemap(全屏三角,exposure push + gamma 编码) 显式完成显示变换,Backbuffer 只接收显示空间颜色。 - Swapchain 改 B8G8R8A8Unorm:Srgb 附件会硬件二次提亮,UI 泛白 (#4296FA→#8CCBFC);Unorm 下写什么显示什么,编码责任归 Tonemap - Shader object push range 规则落地:程序级声明——同一 pass 的 全部 shader EXT range 定义必须一致(VUID-08878),layout 同样 按 vertex|fragment 声明,push 调用点覆盖全部声明 stage(VUID-01796) - Tonemap 装配:Set0 = HDR 图(per-frame-slot 描述符 + GetPhysicalView), clamp 占位待 ACES 替换,bloom/FXAA 等后处理在 HDR 域插 pass - CMake 加 imgui_demo.cpp(ShowDemoWindow 链接) - 修复:m_TonemapDescriptorSets 未 resize 即下标写入(启动即崩) 验证:5 pass 全活,validation 0 error 0 warning,UI 原生色彩无泛白
This commit is contained in:
@@ -64,6 +64,7 @@ namespace Engine {
|
||||
void BuildGraph(); // 声明 pass 结构 + 首次 Compile
|
||||
void HandleResize();
|
||||
void UpdateShadowDescriptors();
|
||||
void UpdateTonemapDescriptors();
|
||||
|
||||
Window& m_Window;
|
||||
|
||||
@@ -96,10 +97,19 @@ namespace Engine {
|
||||
vk::ShaderEXT m_ShadowVertShader{};
|
||||
vk::ShaderEXT m_ShadowFragShader{};
|
||||
|
||||
// Tonemap pass 装配:Set0 = HDR 颜色图,push = {exposure}(fragment)
|
||||
vk::PipelineLayout m_TonemapPipelineLayout;
|
||||
vk::DescriptorSetLayout m_TonemapSetLayout;
|
||||
std::vector<vk::DescriptorSet> m_TonemapDescriptorSets; // 每帧槽位一个
|
||||
vk::Sampler m_TonemapSampler;
|
||||
vk::ShaderEXT m_TonemapVertShader{};
|
||||
vk::ShaderEXT m_TonemapFragShader{};
|
||||
|
||||
// ---- RenderGraph 资源句柄 ----
|
||||
RG::TextureHandle m_Backbuffer{};
|
||||
RG::TextureHandle m_Depth{};
|
||||
RG::TextureHandle m_ShadowMap{};
|
||||
RG::TextureHandle m_HDRColor{}; // Forward 输出(线性 HDR),Tonemap 归一
|
||||
|
||||
// ---- 当帧绑定(Render() 期间有效,供 pass 回调读取)----
|
||||
ECS::Scene* m_BoundScene = nullptr;
|
||||
|
||||
@@ -42,7 +42,10 @@ namespace Engine {
|
||||
vk::PipelineLayout CreatePipelineLayout(vk::DescriptorSetLayout layout,
|
||||
u32 pushConstantSize);
|
||||
|
||||
// 多 set layout 的新接口
|
||||
// 多 set layout 的新接口。
|
||||
// push constant range 按程序级 vertex|fragment 声明(与
|
||||
// ShaderManager 的 shader EXT 声明一致,VUID-08878);
|
||||
// push 调用点必须带同样的双 stage(VUID-01796)
|
||||
vk::PipelineLayout CreatePipelineLayout(
|
||||
const std::vector<vk::DescriptorSetLayout>& layouts,
|
||||
u32 pushConstantSize);
|
||||
|
||||
Reference in New Issue
Block a user