feat: IBL 预积分 GPU compute 化 + 环境资产入 Assets 层(动态切换)

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 轮播自动化验证)。
This commit is contained in:
2026-09-24 13:23:59 +08:00
parent 705250df76
commit 1d690067bd
30 changed files with 1162 additions and 824 deletions
+7 -3
View File
@@ -42,6 +42,7 @@ ShaderObject ShaderManager::CreateFromSPIRV(const std::vector<u32>& spirv,
if (stage == vk::ShaderStageFlagBits::eVertex) {
nextStage = vk::ShaderStageFlagBits::eFragment;
}
// compute 单阶段:无 nextStage(VUID-09183 只约束 graphics 链)
vk::ShaderCreateInfoEXT createInfo;
createInfo.setStage(stage)
@@ -60,9 +61,12 @@ ShaderObject ShaderManager::CreateFromSPIRV(const std::vector<u32>& spirv,
// push range 是"程序级"声明:shader object 要求同一程序绑定的
// 全部 shader(vert+frag)push range 定义完全一致(VUID-08878),
// 因此统一按 vertex|fragment 声明;shader 实际读取哪些字节由
// GLSL 的 push_constant block 决定,声明范围只是能力上限
pushRanges[0].setStageFlags(vk::ShaderStageFlagBits::eVertex |
vk::ShaderStageFlagBits::eFragment)
// GLSL 的 push_constant block 决定,声明范围只是能力上限。
// compute 无程序链,单独按 eCompute 声明(layout/push 调用点一致)
pushRanges[0].setStageFlags(stage == vk::ShaderStageFlagBits::eCompute
? vk::ShaderStageFlagBits::eCompute
: vk::ShaderStageFlagBits::eVertex |
vk::ShaderStageFlagBits::eFragment)
.setOffset(0)
.setSize(pushConstantSize);
createInfo.setPushConstantRanges(pushRanges);