47 Texture &depth_tx = inst_.render_buffers.depth_tx;
49 if (!use_raytracing_) {
54#define PASS_VARIATION(_pass_name, _index, _suffix) \
55 ((_index == 0) ? _pass_name##reflect##_suffix : \
56 (_index == 1) ? _pass_name##refract##_suffix : \
57 _pass_name##diffuse##_suffix)
64 pass.
bind_image(
"tile_raytrace_denoise_img", &tile_raytrace_denoise_tx_);
65 pass.
bind_image(
"tile_raytrace_tracing_img", &tile_raytrace_tracing_tx_);
66 pass.
bind_image(
"tile_horizon_denoise_img", &tile_horizon_denoise_tx_);
67 pass.
bind_image(
"tile_horizon_tracing_img", &tile_horizon_tracing_tx_);
70 pass.
dispatch(&tile_classify_dispatch_size_);
80 pass.
bind_image(
"tile_raytrace_denoise_img", &tile_raytrace_denoise_tx_);
81 pass.
bind_image(
"tile_raytrace_tracing_img", &tile_raytrace_tracing_tx_);
82 pass.
bind_ssbo(
"raytrace_tracing_dispatch_buf", &raytrace_tracing_dispatch_buf_);
83 pass.
bind_ssbo(
"raytrace_denoise_dispatch_buf", &raytrace_denoise_dispatch_buf_);
84 pass.
bind_ssbo(
"raytrace_tracing_tiles_buf", &raytrace_tracing_tiles_buf_);
85 pass.
bind_ssbo(
"raytrace_denoise_tiles_buf", &raytrace_denoise_tiles_buf_);
87 pass.
dispatch(&tile_compact_dispatch_size_);
97 pass.
bind_image(
"out_ray_data_img", &ray_data_tx_);
98 pass.
bind_ssbo(
"tiles_coord_buf", &raytrace_tracing_tiles_buf_);
102 pass.
dispatch(raytrace_tracing_dispatch_buf_);
113 pass.
bind_ssbo(
"tiles_coord_buf", &raytrace_tracing_tiles_buf_);
114 pass.
bind_image(
"ray_data_img", &ray_data_tx_);
115 pass.
bind_image(
"ray_time_img", &ray_time_tx_);
116 pass.
bind_image(
"ray_radiance_img", &ray_radiance_tx_);
125 pass.
dispatch(raytrace_tracing_dispatch_buf_);
133 sh,
"trace_refraction",
reinterpret_cast<bool *
>(&data_.trace_refraction));
136 pass.
bind_ssbo(
"tiles_coord_buf", &raytrace_tracing_tiles_buf_);
137 pass.
bind_image(
"ray_data_img", &ray_data_tx_);
138 pass.
bind_image(
"ray_time_img", &ray_time_tx_);
139 pass.
bind_texture(
"radiance_front_tx", &screen_radiance_front_tx_);
140 pass.
bind_texture(
"radiance_back_tx", &screen_radiance_back_tx_);
141 pass.
bind_texture(
"hiz_front_tx", &inst_.hiz_buffer.front.ref_tx_);
142 pass.
bind_texture(
"hiz_back_tx", &inst_.hiz_buffer.back.ref_tx_);
146 pass.
bind_image(
"ray_radiance_img", &ray_radiance_tx_);
152 pass.
dispatch(raytrace_tracing_dispatch_buf_);
161 pass.
bind_ssbo(
"tiles_coord_buf", &raytrace_tracing_tiles_buf_);
162 pass.
bind_image(
"ray_data_img", &ray_data_tx_);
163 pass.
bind_image(
"ray_time_img", &ray_time_tx_);
164 pass.
bind_image(
"ray_radiance_img", &ray_radiance_tx_);
171 pass.
dispatch(raytrace_tracing_dispatch_buf_);
181 pass.
specialize_constant(sh,
"skip_denoise",
reinterpret_cast<bool *
>(&data_.skip_denoise));
183 pass.
bind_ssbo(
"tiles_coord_buf", &raytrace_denoise_tiles_buf_);
186 pass.
bind_image(
"ray_data_img", &ray_data_tx_);
187 pass.
bind_image(
"ray_time_img", &ray_time_tx_);
188 pass.
bind_image(
"ray_radiance_img", &ray_radiance_tx_);
189 pass.
bind_image(
"out_radiance_img", &denoised_spatial_tx_);
190 pass.
bind_image(
"out_variance_img", &hit_variance_tx_);
191 pass.
bind_image(
"out_hit_depth_img", &hit_depth_tx_);
192 pass.
bind_image(
"tile_mask_img", &tile_raytrace_denoise_tx_);
196 pass.
dispatch(raytrace_denoise_dispatch_buf_);
208 pass.
bind_texture(
"radiance_history_tx", &radiance_history_tx_);
209 pass.
bind_texture(
"variance_history_tx", &variance_history_tx_);
210 pass.
bind_texture(
"tilemask_history_tx", &tilemask_history_tx_);
212 pass.
bind_image(
"hit_depth_img", &hit_depth_tx_);
213 pass.
bind_image(
"in_radiance_img", &denoised_spatial_tx_);
214 pass.
bind_image(
"out_radiance_img", &denoised_temporal_tx_);
215 pass.
bind_image(
"in_variance_img", &hit_variance_tx_);
216 pass.
bind_image(
"out_variance_img", &denoise_variance_tx_);
217 pass.
bind_ssbo(
"tiles_coord_buf", &raytrace_denoise_tiles_buf_);
219 pass.
dispatch(raytrace_denoise_dispatch_buf_);
231 pass.
bind_image(
"in_radiance_img", &denoised_temporal_tx_);
232 pass.
bind_image(
"out_radiance_img", &denoised_bilateral_tx_);
233 pass.
bind_image(
"in_variance_img", &denoise_variance_tx_);
234 pass.
bind_image(
"tile_mask_img", &tile_raytrace_denoise_tx_);
235 pass.
bind_ssbo(
"tiles_coord_buf", &raytrace_denoise_tiles_buf_);
239 pass.
dispatch(raytrace_denoise_dispatch_buf_);
251 pass.
bind_image(
"tile_raytrace_denoise_img", &tile_horizon_denoise_tx_);
252 pass.
bind_image(
"tile_raytrace_tracing_img", &tile_horizon_tracing_tx_);
253 pass.
bind_ssbo(
"raytrace_tracing_dispatch_buf", &horizon_tracing_dispatch_buf_);
254 pass.
bind_ssbo(
"raytrace_denoise_dispatch_buf", &horizon_denoise_dispatch_buf_);
255 pass.
bind_ssbo(
"raytrace_tracing_tiles_buf", &horizon_tracing_tiles_buf_);
256 pass.
bind_ssbo(
"raytrace_denoise_tiles_buf", &horizon_denoise_tiles_buf_);
258 pass.
dispatch(&horizon_schedule_dispatch_size_);
269 pass.
bind_image(
"out_radiance_img", &downsampled_in_radiance_tx_);
270 pass.
bind_image(
"out_normal_img", &downsampled_in_normal_tx_);
273 pass.
dispatch(&horizon_tracing_dispatch_size_);
285 pass.
bind_texture(
"screen_radiance_tx", &downsampled_in_radiance_tx_);
286 pass.
bind_texture(
"screen_normal_tx", &downsampled_in_normal_tx_);
287 pass.
bind_image(
"horizon_radiance_0_img", &horizon_radiance_tx_[0]);
288 pass.
bind_image(
"horizon_radiance_1_img", &horizon_radiance_tx_[1]);
289 pass.
bind_image(
"horizon_radiance_2_img", &horizon_radiance_tx_[2]);
290 pass.
bind_image(
"horizon_radiance_3_img", &horizon_radiance_tx_[3]);
291 pass.
bind_ssbo(
"tiles_coord_buf", &horizon_tracing_tiles_buf_);
297 pass.
dispatch(horizon_tracing_dispatch_buf_);
306 pass.
bind_texture(
"in_sh_0_tx", &horizon_radiance_tx_[0]);
307 pass.
bind_texture(
"in_sh_1_tx", &horizon_radiance_tx_[1]);
308 pass.
bind_texture(
"in_sh_2_tx", &horizon_radiance_tx_[2]);
309 pass.
bind_texture(
"in_sh_3_tx", &horizon_radiance_tx_[3]);
310 pass.
bind_texture(
"screen_normal_tx", &downsampled_in_normal_tx_);
311 pass.
bind_image(
"out_sh_0_img", &horizon_radiance_denoised_tx_[0]);
312 pass.
bind_image(
"out_sh_1_img", &horizon_radiance_denoised_tx_[1]);
313 pass.
bind_image(
"out_sh_2_img", &horizon_radiance_denoised_tx_[2]);
314 pass.
bind_image(
"out_sh_3_img", &horizon_radiance_denoised_tx_[3]);
315 pass.
bind_ssbo(
"tiles_coord_buf", &horizon_tracing_tiles_buf_);
319 pass.
dispatch(horizon_tracing_dispatch_buf_);
329 pass.
bind_texture(
"horizon_radiance_0_tx", &horizon_radiance_denoised_tx_[0]);
330 pass.
bind_texture(
"horizon_radiance_1_tx", &horizon_radiance_denoised_tx_[1]);
331 pass.
bind_texture(
"horizon_radiance_2_tx", &horizon_radiance_denoised_tx_[2]);
332 pass.
bind_texture(
"horizon_radiance_3_tx", &horizon_radiance_denoised_tx_[3]);
333 pass.
bind_texture(
"screen_normal_tx", &downsampled_in_normal_tx_);
334 pass.
bind_image(
"closure0_img", &horizon_scan_output_tx_[0]);
335 pass.
bind_image(
"closure1_img", &horizon_scan_output_tx_[1]);
336 pass.
bind_image(
"closure2_img", &horizon_scan_output_tx_[2]);
337 pass.
bind_ssbo(
"tiles_coord_buf", &horizon_denoise_tiles_buf_);
343 pass.
dispatch(horizon_denoise_dispatch_buf_);
350 const bool use_spatial_denoise = (ray_tracing_options_.denoise_stages &
353 const bool use_temporal_denoise = (ray_tracing_options_.denoise_stages &
356 const bool use_bilateral_denoise = (ray_tracing_options_.denoise_stages &
358 use_temporal_denoise;
360 data_.closure_index =
i;
362 data_.skip_denoise = !use_spatial_denoise;
363 inst_.manager->warm_shader_specialization(tile_classify_ps_);
364 inst_.manager->warm_shader_specialization(tile_compact_ps_);
365 inst_.manager->warm_shader_specialization(generate_ps_);
367 if (inst_.planar_probes.enabled()) {
368 inst_.manager->warm_shader_specialization(trace_planar_ps_);
371 data_.trace_refraction = bool(j);
372 inst_.manager->warm_shader_specialization(trace_screen_ps_);
376 inst_.manager->warm_shader_specialization(trace_fallback_ps_);
378 if (use_spatial_denoise) {
379 inst_.manager->warm_shader_specialization(denoise_spatial_ps_);
381 if (use_temporal_denoise) {
382 inst_.manager->warm_shader_specialization(denoise_temporal_ps_);
384 if (use_bilateral_denoise) {
385 inst_.manager->warm_shader_specialization(denoise_bilateral_ps_);
387 bool use_horizon_scan = ray_tracing_options_.trace_max_roughness < 1.0f;
388 if (use_horizon_scan) {
389 inst_.manager->warm_shader_specialization(horizon_schedule_ps_);
390 inst_.manager->warm_shader_specialization(horizon_setup_ps_);
391 inst_.manager->warm_shader_specialization(horizon_scan_ps_);
392 inst_.manager->warm_shader_specialization(horizon_denoise_ps_);
393 inst_.manager->warm_shader_specialization(horizon_resolve_ps_);
414 radiance_dummy_black_tx_;
415 screen_radiance_back_tx_ = screen_radiance_back_tx ? screen_radiance_back_tx :
416 screen_radiance_front_tx_;
420 bool use_horizon_scan =
options.trace_max_roughness < 1.0f;
423 const int horizon_resolution_scale =
max_ii(
426 const int2 extent = inst_.film.render_extent_get();
429 const int2 dummy_extent(1, 1);
434 const int2 raytrace_tiles_horizon =
divide_ceil(tracing_res_horizon, group_size);
435 const int denoise_tile_count = denoise_tiles.x * denoise_tiles.y;
436 const int raytrace_tile_count = raytrace_tiles.x * raytrace_tiles.y;
437 const int raytrace_tile_count_horizon = raytrace_tiles_horizon.x * raytrace_tiles_horizon.y;
438 tile_classify_dispatch_size_ =
int3(denoise_tiles, 1);
439 horizon_schedule_dispatch_size_ =
int3(
divide_ceil(raytrace_tiles_horizon, group_size), 1);
440 tile_compact_dispatch_size_ =
int3(
divide_ceil(raytrace_tiles, group_size), 1);
441 tracing_dispatch_size_ =
int3(raytrace_tiles, 1);
442 horizon_tracing_dispatch_size_ =
int3(raytrace_tiles_horizon, 1);
445 const int closure_count = 3;
448 tile_raytrace_denoise_tx_.ensure_2d_array(
format, denoise_tiles, closure_count, usage_rw);
449 tile_raytrace_tracing_tx_.ensure_2d_array(
format, raytrace_tiles, closure_count, usage_rw);
451 tile_horizon_denoise_tx_.ensure_2d_array(
format, denoise_tiles, 1, usage_rw);
452 tile_horizon_tracing_tx_.ensure_2d_array(
format, raytrace_tiles_horizon, 1, usage_rw);
454 tile_raytrace_denoise_tx_.clear(
uint4(0u));
455 tile_raytrace_tracing_tx_.clear(
uint4(0u));
456 tile_horizon_denoise_tx_.clear(
uint4(0u));
457 tile_horizon_tracing_tx_.clear(
uint4(0u));
459 horizon_tracing_tiles_buf_.resize(
ceil_to_multiple_u(raytrace_tile_count_horizon, 512));
465 float roughness_mask_start =
options.trace_max_roughness;
466 float roughness_mask_fade = 0.2f;
467 data_.roughness_mask_scale = 1.0 / roughness_mask_fade;
468 data_.roughness_mask_bias = data_.roughness_mask_scale * roughness_mask_start;
471 data_.resolution_scale = resolution_scale;
473 data_.radiance_persmat = render_view.
persmat();
474 data_.full_resolution = extent;
475 data_.full_resolution_inv = 1.0f /
float2(extent);
477 data_.horizon_resolution_scale = horizon_resolution_scale;
479 horizon_resolution_scale);
482 inst_.uniform_data.push_update();
488 const bool has_active_closure = active_closures !=
CLOSURE_NONE;
490 if (has_active_closure) {
491 inst_.manager->submit(tile_classify_ps_);
494 data_.trace_refraction = screen_radiance_back_tx !=
nullptr;
496 for (
int i = 0;
i < 3;
i++) {
497 result.closures[
i] = trace(
i, (closure_count >
i),
options, rt_buffer, main_view, render_view);
500 if (has_active_closure) {
501 if (use_horizon_scan) {
504 downsampled_in_radiance_tx_.acquire(
505 tracing_res_horizon, gpu::TextureFormat::RAYTRACE_RADIANCE_FORMAT, usage_rw);
506 downsampled_in_normal_tx_.acquire(
507 tracing_res_horizon, gpu::TextureFormat::UNORM_10_10_10_2, usage_rw);
509 horizon_radiance_tx_[0].acquire(
510 tracing_res_horizon, gpu::TextureFormat::SFLOAT_16_16_16_16, usage_rw);
511 horizon_radiance_denoised_tx_[0].acquire(
512 tracing_res_horizon, gpu::TextureFormat::SFLOAT_16_16_16_16, usage_rw);
514 horizon_radiance_tx_[
i].acquire(
515 tracing_res_horizon, gpu::TextureFormat::UNORM_8_8_8_8, usage_rw);
516 horizon_radiance_denoised_tx_[
i].acquire(
517 tracing_res_horizon, gpu::TextureFormat::UNORM_8_8_8_8, usage_rw);
520 horizon_scan_output_tx_[
i] =
result.closures[
i];
523 horizon_tracing_dispatch_buf_.clear_to_zero();
524 horizon_denoise_dispatch_buf_.clear_to_zero();
525 inst_.manager->submit(horizon_schedule_ps_);
527 inst_.manager->submit(horizon_setup_ps_, render_view);
528 inst_.manager->submit(horizon_scan_ps_, render_view);
529 inst_.manager->submit(horizon_denoise_ps_, render_view);
530 inst_.manager->submit(horizon_resolve_ps_, render_view);
533 horizon_radiance_tx_[
i].release();
534 horizon_radiance_denoised_tx_[
i].release();
536 downsampled_in_radiance_tx_.release();
537 downsampled_in_normal_tx_.release();