CPU 逐像素卷积(venice 4k 阻塞 7.36s)→ 4 个 compute shader 一次性 提交:equirect→cube / irradiance / prefilter×5mip / BRDF LUT。 Cubemap 瘦身为纯资源持有类,生成职责移交 IblGenerator; 环境经 AssetManager 缓存(EnvRef),Renderer::SetEnvironment 动态换绑(RenderPass::OnEnvironmentChanged 广播)。 调试视图 +4:EnvCube / Irradiance / Prefilter / BRDF LUT。 性能前后对比(RTX 5060 Laptop,venice_dawn_1_4k.hdr): - 改造前 CPU:7.36 s(主线程阻塞) - 改造后 GPU:HDR decode 127-134ms + 资源 22-35ms + compute 17-19ms ≈ 165-190ms(约 40×);Neutral 兜底 ~6ms - 运行中动态切换环境同量级(ms 级 GPU,decode 占大头) 冒烟:两构建目录 0 警告;运行期 0 validation(含两次环境切换 + 调试视图 9-12 轮播自动化验证)。
43 lines
1.5 KiB
C++
43 lines
1.5 KiB
C++
//
|
||
// Created by atdunbg on 2026/9/23.
|
||
//
|
||
// RenderPass:渲染 pass 对象基类(Unity ScriptableRenderPass 思路)。
|
||
//
|
||
// pass 自己负责两件事,框架(Renderer)不再手写"超级函数":
|
||
// Register —— 向 RenderGraph 声明资源使用 + 录制 lambda;
|
||
// 执行序由 RG 拓扑排序决定(writer 必先于 reader),
|
||
// 与注册顺序无关
|
||
// OnTargetsRebuilt —— RG 重编译(resize / vsync 切换)后重绑描述符
|
||
// (物理镜像按槽位可能全部换新)
|
||
//
|
||
// pass 之间不互相依赖:数据流只经 RG 资源句柄。新增效果 = 新增一个
|
||
// RenderPass 子类 + Renderer::BuildGraph 里注册一行,其它代码不动。
|
||
//
|
||
|
||
#ifndef HELLOVULKAN_RENDERPASS_H
|
||
#define HELLOVULKAN_RENDERPASS_H
|
||
|
||
#include <Engine/RenderGraph/RenderGraph.h>
|
||
|
||
namespace Engine {
|
||
class Cubemap;
|
||
}
|
||
|
||
namespace Engine::Passes {
|
||
|
||
class RenderPass {
|
||
public:
|
||
virtual ~RenderPass() = default;
|
||
|
||
virtual void Register(RG::RenderGraph& rg) = 0;
|
||
virtual void OnTargetsRebuilt(RG::RenderGraph& rg) { (void)rg; }
|
||
|
||
// 环境资产换绑(动态切换):引用环境描述符的 pass 重绑自己的 set。
|
||
// 默认无环境影响;env 恒非空(Renderer 有中性兜底)
|
||
virtual void OnEnvironmentChanged(const Cubemap* /*env*/) {}
|
||
};
|
||
|
||
} // namespace Engine::Passes
|
||
|
||
#endif //HELLOVULKAN_RENDERPASS_H
|