114 const auto&
input = params.input;
115 const auto& config = params.config;
117 int mip_count = math::clamp(config.mip_count, 2, max_mip_count);
118 const auto viewport_size =
input->get_size();
120 create_or_resize_mip_chain(rview, viewport_size, mip_count);
126 const auto& mip0_fbo = get_mip_fbo(rview, 0);
127 auto mip0_size = mip0_fbo->get_size();
130 pass.
bind(mip0_fbo.get());
132 pass.
clear(BGFX_CLEAR_COLOR, 0, 0.0f, 0);
134 downsample_program_.program->begin();
136 float pixel_size[4] = {1.0f / float(viewport_size.width),
137 1.0f / float(viewport_size.height),
142 float params_data[4] = {config.threshold, 0.0f, config.soft_knee, config.clamp};
152 gfx::set_state(topology | BGFX_STATE_WRITE_RGB | BGFX_STATE_WRITE_A);
153 gfx::submit(pass.
id, downsample_program_.program->native_handle());
155 downsample_program_.program->end();
159 for(
int i = 0; i < mip_count - 1; ++i)
161 uint32_t src_w = viewport_size.width >> (i + 1);
162 uint32_t src_h = viewport_size.height >> (i + 1);
163 uint32_t out_w = viewport_size.width >> (i + 2);
164 uint32_t out_h = viewport_size.height >> (i + 2);
174 const auto& fbo = get_mip_fbo(rview, i + 1);
177 pass.
bind(fbo.get());
179 pass.
clear(BGFX_CLEAR_COLOR, 0, 0.0f, 0);
181 downsample_program_.program->begin();
183 float pixel_size[4] = {1.0f / float(src_w), 1.0f / float(src_h), 0.0f, 0.0f};
186 float params_data[4] = {0.0f, 1.0f, 0.0f, 0.0f};
189 gfx::set_texture(downsample_program_.s_tex, 0, rview.tex_get(
"BLOOM_MIP_" + std::to_string(i)));
194 gfx::set_state(topology | BGFX_STATE_WRITE_RGB | BGFX_STATE_WRITE_A);
195 gfx::submit(pass.
id, downsample_program_.program->native_handle());
197 downsample_program_.program->end();
203 const auto& mip0_fbo = get_mip_fbo(rview, 0);
205 clear_pass.
bind(mip0_fbo.get());
207 clear_pass.
clear(BGFX_CLEAR_COLOR, 0, 0.0f, 0);
211 for(
int i = 0; i < mip_count - 1; ++i)
213 int src_idx = mip_count - 1 - i;
214 int out_idx = mip_count - 2 - i;
215 uint32_t out_w = viewport_size.width >> (out_idx + 1);
216 uint32_t out_h = viewport_size.height >> (out_idx + 1);
222 const auto& fbo = get_mip_fbo(rview, out_idx);
225 pass.
bind(fbo.get());
228 upsample_program_.program->begin();
230 float pixel_size[4] = {1.0f / float(out_w), 1.0f / float(out_h), 0.0f, 0.0f};
233 const auto& mip_tint = config.get_mip_tint(src_idx);
234 float effective_weight = config.intensity * mip_tint.value.w;
235 float tint[4] = {mip_tint.value.x, mip_tint.value.y, mip_tint.value.z, effective_weight};
238 gfx::set_texture(upsample_program_.s_tex, 0, rview.tex_get(
"BLOOM_MIP_" + std::to_string(src_idx)));
243 gfx::set_state(topology | BGFX_STATE_WRITE_RGB | BGFX_STATE_WRITE_A | BGFX_STATE_BLEND_ADD);
244 gfx::submit(pass.
id, upsample_program_.program->native_handle());
246 upsample_program_.program->end();
251 auto output = create_or_update_output_fb(rview,
input, params.output);
254 pass.
bind(output.get());
257 combine_program_.program->begin();
260 gfx::set_texture(combine_program_.s_bloom, 1, rview.tex_get(
"BLOOM_MIP_0"));
262 const auto output_size = output->get_size();
266 gfx::set_state(topology | BGFX_STATE_WRITE_RGB | BGFX_STATE_WRITE_A);
267 gfx::submit(pass.
id, combine_program_.program->native_handle());
269 combine_program_.program->end();