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_);
93 GPUShader *sh = inst_.shaders.static_shader_get(
RAY_GENERATE);
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_);
206 pass.
bind_texture(
"radiance_history_tx", &radiance_history_tx_);
207 pass.
bind_texture(
"variance_history_tx", &variance_history_tx_);
208 pass.
bind_texture(
"tilemask_history_tx", &tilemask_history_tx_);
210 pass.
bind_image(
"hit_depth_img", &hit_depth_tx_);
211 pass.
bind_image(
"in_radiance_img", &denoised_spatial_tx_);
212 pass.
bind_image(
"out_radiance_img", &denoised_temporal_tx_);
213 pass.
bind_image(
"in_variance_img", &hit_variance_tx_);
214 pass.
bind_image(
"out_variance_img", &denoise_variance_tx_);
215 pass.
bind_ssbo(
"tiles_coord_buf", &raytrace_denoise_tiles_buf_);
217 pass.
dispatch(raytrace_denoise_dispatch_buf_);
227 pass.
bind_image(
"in_radiance_img", &denoised_temporal_tx_);
228 pass.
bind_image(
"out_radiance_img", &denoised_bilateral_tx_);
229 pass.
bind_image(
"in_variance_img", &denoise_variance_tx_);
230 pass.
bind_image(
"tile_mask_img", &tile_raytrace_denoise_tx_);
231 pass.
bind_ssbo(
"tiles_coord_buf", &raytrace_denoise_tiles_buf_);
235 pass.
dispatch(raytrace_denoise_dispatch_buf_);
246 pass.
bind_image(
"tile_raytrace_denoise_img", &tile_horizon_denoise_tx_);
247 pass.
bind_image(
"tile_raytrace_tracing_img", &tile_horizon_tracing_tx_);
248 pass.
bind_ssbo(
"raytrace_tracing_dispatch_buf", &horizon_tracing_dispatch_buf_);
249 pass.
bind_ssbo(
"raytrace_denoise_dispatch_buf", &horizon_denoise_dispatch_buf_);
250 pass.
bind_ssbo(
"raytrace_tracing_tiles_buf", &horizon_tracing_tiles_buf_);
251 pass.
bind_ssbo(
"raytrace_denoise_tiles_buf", &horizon_denoise_tiles_buf_);
253 pass.
dispatch(&horizon_schedule_dispatch_size_);
264 pass.
bind_image(
"out_radiance_img", &downsampled_in_radiance_tx_);
265 pass.
bind_image(
"out_normal_img", &downsampled_in_normal_tx_);
268 pass.
dispatch(&horizon_tracing_dispatch_size_);
274 GPUShader *sh = inst_.shaders.static_shader_get(
HORIZON_SCAN);
279 pass.
bind_texture(
"screen_radiance_tx", &downsampled_in_radiance_tx_);
280 pass.
bind_texture(
"screen_normal_tx", &downsampled_in_normal_tx_);
281 pass.
bind_image(
"horizon_radiance_0_img", &horizon_radiance_tx_[0]);
282 pass.
bind_image(
"horizon_radiance_1_img", &horizon_radiance_tx_[1]);
283 pass.
bind_image(
"horizon_radiance_2_img", &horizon_radiance_tx_[2]);
284 pass.
bind_image(
"horizon_radiance_3_img", &horizon_radiance_tx_[3]);
285 pass.
bind_ssbo(
"tiles_coord_buf", &horizon_tracing_tiles_buf_);
291 pass.
dispatch(horizon_tracing_dispatch_buf_);
299 pass.
bind_texture(
"in_sh_0_tx", &horizon_radiance_tx_[0]);
300 pass.
bind_texture(
"in_sh_1_tx", &horizon_radiance_tx_[1]);
301 pass.
bind_texture(
"in_sh_2_tx", &horizon_radiance_tx_[2]);
302 pass.
bind_texture(
"in_sh_3_tx", &horizon_radiance_tx_[3]);
303 pass.
bind_texture(
"screen_normal_tx", &downsampled_in_normal_tx_);
304 pass.
bind_image(
"out_sh_0_img", &horizon_radiance_denoised_tx_[0]);
305 pass.
bind_image(
"out_sh_1_img", &horizon_radiance_denoised_tx_[1]);
306 pass.
bind_image(
"out_sh_2_img", &horizon_radiance_denoised_tx_[2]);
307 pass.
bind_image(
"out_sh_3_img", &horizon_radiance_denoised_tx_[3]);
308 pass.
bind_ssbo(
"tiles_coord_buf", &horizon_tracing_tiles_buf_);
312 pass.
dispatch(horizon_tracing_dispatch_buf_);
321 pass.
bind_texture(
"horizon_radiance_0_tx", &horizon_radiance_denoised_tx_[0]);
322 pass.
bind_texture(
"horizon_radiance_1_tx", &horizon_radiance_denoised_tx_[1]);
323 pass.
bind_texture(
"horizon_radiance_2_tx", &horizon_radiance_denoised_tx_[2]);
324 pass.
bind_texture(
"horizon_radiance_3_tx", &horizon_radiance_denoised_tx_[3]);
325 pass.
bind_texture(
"screen_normal_tx", &downsampled_in_normal_tx_);
326 pass.
bind_image(
"closure0_img", &horizon_scan_output_tx_[0]);
327 pass.
bind_image(
"closure1_img", &horizon_scan_output_tx_[1]);
328 pass.
bind_image(
"closure2_img", &horizon_scan_output_tx_[2]);
329 pass.
bind_ssbo(
"tiles_coord_buf", &horizon_denoise_tiles_buf_);
335 pass.
dispatch(horizon_denoise_dispatch_buf_);
341 const bool use_spatial_denoise = (ray_tracing_options_.denoise_stages &
344 const bool use_temporal_denoise = (ray_tracing_options_.denoise_stages &
347 const bool use_bilateral_denoise = (ray_tracing_options_.denoise_stages &
349 use_temporal_denoise;
351 data_.closure_index =
i;
353 data_.skip_denoise = !use_spatial_denoise;
354 inst_.manager->warm_shader_specialization(tile_classify_ps_);
355 inst_.manager->warm_shader_specialization(tile_compact_ps_);
356 inst_.manager->warm_shader_specialization(generate_ps_);
358 if (inst_.planar_probes.enabled()) {
359 inst_.manager->warm_shader_specialization(trace_planar_ps_);
362 data_.trace_refraction = bool(j);
363 inst_.manager->warm_shader_specialization(trace_screen_ps_);
367 inst_.manager->warm_shader_specialization(trace_fallback_ps_);
369 if (use_spatial_denoise) {
370 inst_.manager->warm_shader_specialization(denoise_spatial_ps_);
372 if (use_temporal_denoise) {
373 inst_.manager->warm_shader_specialization(denoise_temporal_ps_);
375 if (use_bilateral_denoise) {
376 inst_.manager->warm_shader_specialization(denoise_bilateral_ps_);
378 bool use_horizon_scan = ray_tracing_options_.trace_max_roughness < 1.0f;
379 if (use_horizon_scan) {
380 inst_.manager->warm_shader_specialization(horizon_schedule_ps_);
381 inst_.manager->warm_shader_specialization(horizon_setup_ps_);
382 inst_.manager->warm_shader_specialization(horizon_scan_ps_);
383 inst_.manager->warm_shader_specialization(horizon_denoise_ps_);
384 inst_.manager->warm_shader_specialization(horizon_resolve_ps_);
394 GPUTexture *screen_radiance_back_tx,
405 radiance_dummy_black_tx_;
406 screen_radiance_back_tx_ = screen_radiance_back_tx ? screen_radiance_back_tx :
407 screen_radiance_front_tx_;
411 bool use_horizon_scan =
options.trace_max_roughness < 1.0f;
414 const int horizon_resolution_scale =
max_ii(
417 const int2 extent = inst_.film.render_extent_get();
420 const int2 dummy_extent(1, 1);
425 const int2 raytrace_tiles_horizon =
divide_ceil(tracing_res_horizon, group_size);
426 const int denoise_tile_count = denoise_tiles.x * denoise_tiles.y;
427 const int raytrace_tile_count = raytrace_tiles.x * raytrace_tiles.y;
428 const int raytrace_tile_count_horizon = raytrace_tiles_horizon.x * raytrace_tiles_horizon.y;
429 tile_classify_dispatch_size_ =
int3(denoise_tiles, 1);
430 horizon_schedule_dispatch_size_ =
int3(
divide_ceil(raytrace_tiles_horizon, group_size), 1);
431 tile_compact_dispatch_size_ =
int3(
divide_ceil(raytrace_tiles, group_size), 1);
432 tracing_dispatch_size_ =
int3(raytrace_tiles, 1);
433 horizon_tracing_dispatch_size_ =
int3(raytrace_tiles_horizon, 1);
436 const int closure_count = 3;
439 tile_raytrace_denoise_tx_.ensure_2d_array(
format, denoise_tiles, closure_count, usage_rw);
440 tile_raytrace_tracing_tx_.ensure_2d_array(
format, raytrace_tiles, closure_count, usage_rw);
442 tile_horizon_denoise_tx_.ensure_2d_array(
format, denoise_tiles, 1, usage_rw);
443 tile_horizon_tracing_tx_.ensure_2d_array(
format, raytrace_tiles_horizon, 1, usage_rw);
445 tile_raytrace_denoise_tx_.clear(
uint4(0u));
446 tile_raytrace_tracing_tx_.clear(
uint4(0u));
447 tile_horizon_denoise_tx_.clear(
uint4(0u));
448 tile_horizon_tracing_tx_.clear(
uint4(0u));
450 horizon_tracing_tiles_buf_.resize(
ceil_to_multiple_u(raytrace_tile_count_horizon, 512));
456 float roughness_mask_start =
options.trace_max_roughness;
457 float roughness_mask_fade = 0.2f;
458 data_.roughness_mask_scale = 1.0 / roughness_mask_fade;
459 data_.roughness_mask_bias = data_.roughness_mask_scale * roughness_mask_start;
462 data_.resolution_scale = resolution_scale;
464 data_.radiance_persmat = render_view.
persmat();
465 data_.full_resolution = extent;
466 data_.full_resolution_inv = 1.0f /
float2(extent);
468 data_.horizon_resolution_scale = horizon_resolution_scale;
470 horizon_resolution_scale);
473 inst_.uniform_data.push_update();
479 const bool has_active_closure = active_closures !=
CLOSURE_NONE;
481 if (has_active_closure) {
482 inst_.manager->submit(tile_classify_ps_);
485 data_.trace_refraction = screen_radiance_back_tx !=
nullptr;
487 for (
int i = 0;
i < 3;
i++) {
488 result.closures[
i] = trace(
i, (closure_count >
i),
options, rt_buffer, main_view, render_view);
491 if (has_active_closure) {
492 if (use_horizon_scan) {
496 downsampled_in_normal_tx_.acquire(tracing_res_horizon,
GPU_RGB10_A2, usage_rw);
498 horizon_radiance_tx_[0].acquire(tracing_res_horizon,
GPU_RGBA16F, usage_rw);
499 horizon_radiance_denoised_tx_[0].acquire(tracing_res_horizon,
GPU_RGBA16F, usage_rw);
501 horizon_radiance_tx_[
i].acquire(tracing_res_horizon,
GPU_RGBA8, usage_rw);
502 horizon_radiance_denoised_tx_[
i].acquire(tracing_res_horizon,
GPU_RGBA8, usage_rw);
505 horizon_scan_output_tx_[
i] =
result.closures[
i];
508 horizon_tracing_dispatch_buf_.clear_to_zero();
509 horizon_denoise_dispatch_buf_.clear_to_zero();
510 inst_.manager->submit(horizon_schedule_ps_);
512 inst_.manager->submit(horizon_setup_ps_, render_view);
513 inst_.manager->submit(horizon_scan_ps_, render_view);
514 inst_.manager->submit(horizon_denoise_ps_, render_view);
515 inst_.manager->submit(horizon_resolve_ps_, render_view);
518 horizon_radiance_tx_[
i].release();
519 horizon_radiance_denoised_tx_[
i].release();
521 downsampled_in_radiance_tx_.release();
522 downsampled_in_normal_tx_.release();