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:
@@ -74,6 +74,20 @@ namespace Engine::Passes
|
||||
vkDevice.destroyDescriptorSetLayout(m_SetLayout);
|
||||
}
|
||||
|
||||
void SkyboxPass::OnEnvironmentChanged(const Cubemap* env)
|
||||
{
|
||||
m_Env = env;
|
||||
if (!m_Env) return;
|
||||
|
||||
// cube view 全程稳定语义是"单个环境内";切换环境 = 新 view,
|
||||
// per-slot set 全部重绑
|
||||
for (u32 slot = 0; slot < kMaxFramesInFlight; ++slot) {
|
||||
m_Descriptors.UpdateTexture(m_Sets[slot], 0,
|
||||
m_Env->GetSampler(),
|
||||
m_Env->GetView());
|
||||
}
|
||||
}
|
||||
|
||||
void SkyboxPass::Register(RG::RenderGraph& rg)
|
||||
{
|
||||
rg.AddPass("Skybox", [this](RG::RenderGraphContext& ctx) {
|
||||
|
||||
Reference in New Issue
Block a user