17 auto cs_hiz_downsample = am.get_asset<
gfx::shader>(
"engine:/data/shaders/ssr/cs_hiz_downsample.sc");
19 if (!cs_hiz_generate || !cs_hiz_downsample)
25 hiz_generate_.program = std::make_shared<gpu_program>(cs_hiz_generate);
26 hiz_downsample_.program = std::make_shared<gpu_program>(cs_hiz_downsample);
29 hiz_generate_.cache_uniforms();
30 hiz_downsample_.cache_uniforms();
32 return hiz_generate_.program->is_valid() && hiz_downsample_.program->is_valid();
40 if (!depth_buffer || !output_hiz || !params.
cam)
45 const uint32_t hiz_width = output_hiz->info.width;
46 const uint32_t hiz_height = output_hiz->info.height;
47 const uint32_t num_mips = output_hiz->info.numMips;
54 hiz_generate_.program->begin();
60 gfx::set_image(1, output_hiz->native_handle(), 0, bgfx::Access::Write);
63 math::vec4 hiz_params(
float(hiz_width),
float(hiz_height), 0.0f, 0.0f);
67 uint32_t num_groups_x = (hiz_width + 7) / 8;
68 uint32_t num_groups_y = (hiz_height + 7) / 8;
69 bgfx::dispatch(pass.
id, hiz_generate_.program->native_handle(), num_groups_x, num_groups_y, 1);
71 hiz_generate_.program->end();
80 hiz_downsample_.program->begin();
82 for (uint32_t mip = 1; mip < num_mips; ++mip)
84 const uint32_t current_mip_width = hiz_width >> mip;
85 const uint32_t current_mip_height = hiz_height >> mip;
88 if (current_mip_width == 0 || current_mip_height == 0)
94 gfx::set_image(0, output_hiz->native_handle(), mip - 1, bgfx::Access::Read);
97 gfx::set_image(1, output_hiz->native_handle(), mip, bgfx::Access::Write);
100 math::vec4 hiz_params(
float(current_mip_width),
float(current_mip_height), 2.0f,
float(mip));
104 uint32_t num_groups_x = (current_mip_width + 7) / 8;
105 uint32_t num_groups_y = (current_mip_height + 7) / 8;
106 bgfx::dispatch(pass.
id, hiz_downsample_.program->native_handle(), num_groups_x, num_groups_y, 1);
110 hiz_downsample_.program->end();