48 Texture &depth_tx = inst_.render_buffers.depth_tx;
50#define PASS_VARIATION(_pass_name, _index, _suffix) \
51 ((_index == 0) ? _pass_name##reflect##_suffix : \
52 (_index == 1) ? _pass_name##refract##_suffix : \
53 _pass_name##diffuse##_suffix)
60 pass.
bind_image(
"tile_raytrace_denoise_img", &tile_raytrace_denoise_tx_);
61 pass.
bind_image(
"tile_raytrace_tracing_img", &tile_raytrace_tracing_tx_);
62 pass.
bind_image(
"tile_horizon_denoise_img", &tile_horizon_denoise_tx_);
63 pass.
bind_image(
"tile_horizon_tracing_img", &tile_horizon_tracing_tx_);
66 pass.
dispatch(&tile_classify_dispatch_size_);
76 pass.
bind_image(
"tile_raytrace_denoise_img", &tile_raytrace_denoise_tx_);
77 pass.
bind_image(
"tile_raytrace_tracing_img", &tile_raytrace_tracing_tx_);
78 pass.
bind_ssbo(
"raytrace_tracing_dispatch_buf", &raytrace_tracing_dispatch_buf_);
79 pass.
bind_ssbo(
"raytrace_denoise_dispatch_buf", &raytrace_denoise_dispatch_buf_);
80 pass.
bind_ssbo(
"raytrace_tracing_tiles_buf", &raytrace_tracing_tiles_buf_);
81 pass.
bind_ssbo(
"raytrace_denoise_tiles_buf", &raytrace_denoise_tiles_buf_);
83 pass.
dispatch(&tile_compact_dispatch_size_);
93 pass.
bind_image(
"out_ray_data_img", &ray_data_tx_);
94 pass.
bind_ssbo(
"tiles_coord_buf", &raytrace_tracing_tiles_buf_);
98 pass.
dispatch(raytrace_tracing_dispatch_buf_);
109 pass.
bind_ssbo(
"tiles_coord_buf", &raytrace_tracing_tiles_buf_);
110 pass.
bind_image(
"ray_data_img", &ray_data_tx_);
111 pass.
bind_image(
"ray_time_img", &ray_time_tx_);
112 pass.
bind_image(
"ray_radiance_img", &ray_radiance_tx_);
121 pass.
dispatch(raytrace_tracing_dispatch_buf_);
129 sh,
"trace_refraction",
reinterpret_cast<bool *
>(&data_.trace_refraction));
132 pass.
bind_ssbo(
"tiles_coord_buf", &raytrace_tracing_tiles_buf_);
133 pass.
bind_image(
"ray_data_img", &ray_data_tx_);
134 pass.
bind_image(
"ray_time_img", &ray_time_tx_);
135 pass.
bind_texture(
"radiance_front_tx", &screen_radiance_front_tx_);
136 pass.
bind_texture(
"radiance_back_tx", &screen_radiance_back_tx_);
137 pass.
bind_texture(
"hiz_front_tx", &inst_.hiz_buffer.front.ref_tx_);
138 pass.
bind_texture(
"hiz_back_tx", &inst_.hiz_buffer.back.ref_tx_);
142 pass.
bind_image(
"ray_radiance_img", &ray_radiance_tx_);
148 pass.
dispatch(raytrace_tracing_dispatch_buf_);
157 pass.
bind_ssbo(
"tiles_coord_buf", &raytrace_tracing_tiles_buf_);
158 pass.
bind_image(
"ray_data_img", &ray_data_tx_);
159 pass.
bind_image(
"ray_time_img", &ray_time_tx_);
160 pass.
bind_image(
"ray_radiance_img", &ray_radiance_tx_);
167 pass.
dispatch(raytrace_tracing_dispatch_buf_);
177 pass.
specialize_constant(sh,
"skip_denoise",
reinterpret_cast<bool *
>(&data_.skip_denoise));
179 pass.
bind_ssbo(
"tiles_coord_buf", &raytrace_denoise_tiles_buf_);
182 pass.
bind_image(
"ray_data_img", &ray_data_tx_);
183 pass.
bind_image(
"ray_time_img", &ray_time_tx_);
184 pass.
bind_image(
"ray_radiance_img", &ray_radiance_tx_);
185 pass.
bind_image(
"out_radiance_img", &denoised_spatial_tx_);
186 pass.
bind_image(
"out_variance_img", &hit_variance_tx_);
187 pass.
bind_image(
"out_hit_depth_img", &hit_depth_tx_);
188 pass.
bind_image(
"tile_mask_img", &tile_raytrace_denoise_tx_);
192 pass.
dispatch(raytrace_denoise_dispatch_buf_);
202 pass.
bind_texture(
"radiance_history_tx", &radiance_history_tx_);
203 pass.
bind_texture(
"variance_history_tx", &variance_history_tx_);
204 pass.
bind_texture(
"tilemask_history_tx", &tilemask_history_tx_);
206 pass.
bind_image(
"hit_depth_img", &hit_depth_tx_);
207 pass.
bind_image(
"in_radiance_img", &denoised_spatial_tx_);
208 pass.
bind_image(
"out_radiance_img", &denoised_temporal_tx_);
209 pass.
bind_image(
"in_variance_img", &hit_variance_tx_);
210 pass.
bind_image(
"out_variance_img", &denoise_variance_tx_);
211 pass.
bind_ssbo(
"tiles_coord_buf", &raytrace_denoise_tiles_buf_);
213 pass.
dispatch(raytrace_denoise_dispatch_buf_);
223 pass.
bind_image(
"in_radiance_img", &denoised_temporal_tx_);
224 pass.
bind_image(
"out_radiance_img", &denoised_bilateral_tx_);
225 pass.
bind_image(
"in_variance_img", &denoise_variance_tx_);
226 pass.
bind_image(
"tile_mask_img", &tile_raytrace_denoise_tx_);
227 pass.
bind_ssbo(
"tiles_coord_buf", &raytrace_denoise_tiles_buf_);
231 pass.
dispatch(raytrace_denoise_dispatch_buf_);
242 pass.
bind_image(
"tile_raytrace_denoise_img", &tile_horizon_denoise_tx_);
243 pass.
bind_image(
"tile_raytrace_tracing_img", &tile_horizon_tracing_tx_);
244 pass.
bind_ssbo(
"raytrace_tracing_dispatch_buf", &horizon_tracing_dispatch_buf_);
245 pass.
bind_ssbo(
"raytrace_denoise_dispatch_buf", &horizon_denoise_dispatch_buf_);
246 pass.
bind_ssbo(
"raytrace_tracing_tiles_buf", &horizon_tracing_tiles_buf_);
247 pass.
bind_ssbo(
"raytrace_denoise_tiles_buf", &horizon_denoise_tiles_buf_);
249 pass.
dispatch(&horizon_schedule_dispatch_size_);
260 pass.
bind_image(
"out_radiance_img", &downsampled_in_radiance_tx_);
261 pass.
bind_image(
"out_normal_img", &downsampled_in_normal_tx_);
264 pass.
dispatch(&horizon_tracing_dispatch_size_);
275 pass.
bind_texture(
"screen_radiance_tx", &downsampled_in_radiance_tx_);
276 pass.
bind_texture(
"screen_normal_tx", &downsampled_in_normal_tx_);
277 pass.
bind_image(
"horizon_radiance_0_img", &horizon_radiance_tx_[0]);
278 pass.
bind_image(
"horizon_radiance_1_img", &horizon_radiance_tx_[1]);
279 pass.
bind_image(
"horizon_radiance_2_img", &horizon_radiance_tx_[2]);
280 pass.
bind_image(
"horizon_radiance_3_img", &horizon_radiance_tx_[3]);
281 pass.
bind_ssbo(
"tiles_coord_buf", &horizon_tracing_tiles_buf_);
287 pass.
dispatch(horizon_tracing_dispatch_buf_);
295 pass.
bind_texture(
"in_sh_0_tx", &horizon_radiance_tx_[0]);
296 pass.
bind_texture(
"in_sh_1_tx", &horizon_radiance_tx_[1]);
297 pass.
bind_texture(
"in_sh_2_tx", &horizon_radiance_tx_[2]);
298 pass.
bind_texture(
"in_sh_3_tx", &horizon_radiance_tx_[3]);
299 pass.
bind_texture(
"screen_normal_tx", &downsampled_in_normal_tx_);
300 pass.
bind_image(
"out_sh_0_img", &horizon_radiance_denoised_tx_[0]);
301 pass.
bind_image(
"out_sh_1_img", &horizon_radiance_denoised_tx_[1]);
302 pass.
bind_image(
"out_sh_2_img", &horizon_radiance_denoised_tx_[2]);
303 pass.
bind_image(
"out_sh_3_img", &horizon_radiance_denoised_tx_[3]);
304 pass.
bind_ssbo(
"tiles_coord_buf", &horizon_tracing_tiles_buf_);
308 pass.
dispatch(horizon_tracing_dispatch_buf_);
317 pass.
bind_texture(
"horizon_radiance_0_tx", &horizon_radiance_denoised_tx_[0]);
318 pass.
bind_texture(
"horizon_radiance_1_tx", &horizon_radiance_denoised_tx_[1]);
319 pass.
bind_texture(
"horizon_radiance_2_tx", &horizon_radiance_denoised_tx_[2]);
320 pass.
bind_texture(
"horizon_radiance_3_tx", &horizon_radiance_denoised_tx_[3]);
321 pass.
bind_texture(
"screen_normal_tx", &downsampled_in_normal_tx_);
322 pass.
bind_image(
"closure0_img", &horizon_scan_output_tx_[0]);
323 pass.
bind_image(
"closure1_img", &horizon_scan_output_tx_[1]);
324 pass.
bind_image(
"closure2_img", &horizon_scan_output_tx_[2]);
325 pass.
bind_ssbo(
"tiles_coord_buf", &horizon_denoise_tiles_buf_);
331 pass.
dispatch(horizon_denoise_dispatch_buf_);
341 GPUTexture *screen_radiance_back_tx,
351 radiance_dummy_black_tx_;
352 screen_radiance_back_tx_ = screen_radiance_back_tx ? screen_radiance_back_tx :
353 screen_radiance_front_tx_;
357 bool use_horizon_scan =
options.trace_max_roughness < 1.0f;
360 const int horizon_resolution_scale =
max_ii(
363 const int2 extent = inst_.film.render_extent_get();
366 const int2 dummy_extent(1, 1);
371 const int2 raytrace_tiles_horizon =
divide_ceil(tracing_res_horizon, group_size);
372 const int denoise_tile_count = denoise_tiles.x * denoise_tiles.y;
373 const int raytrace_tile_count = raytrace_tiles.x * raytrace_tiles.y;
374 const int raytrace_tile_count_horizon = raytrace_tiles_horizon.x * raytrace_tiles_horizon.y;
375 tile_classify_dispatch_size_ =
int3(denoise_tiles, 1);
376 horizon_schedule_dispatch_size_ =
int3(
divide_ceil(raytrace_tiles_horizon, group_size), 1);
377 tile_compact_dispatch_size_ =
int3(
divide_ceil(raytrace_tiles, group_size), 1);
378 tracing_dispatch_size_ =
int3(raytrace_tiles, 1);
379 horizon_tracing_dispatch_size_ =
int3(raytrace_tiles_horizon, 1);
382 const int closure_count = 3;
385 tile_raytrace_denoise_tx_.ensure_2d_array(
format, denoise_tiles, closure_count, usage_rw);
386 tile_raytrace_tracing_tx_.ensure_2d_array(
format, raytrace_tiles, closure_count, usage_rw);
388 tile_horizon_denoise_tx_.ensure_2d_array(
format, denoise_tiles, 1, usage_rw);
389 tile_horizon_tracing_tx_.ensure_2d_array(
format, raytrace_tiles_horizon, 1, usage_rw);
391 tile_raytrace_denoise_tx_.clear(
uint4(0u));
392 tile_raytrace_tracing_tx_.clear(
uint4(0u));
393 tile_horizon_denoise_tx_.clear(
uint4(0u));
394 tile_horizon_tracing_tx_.clear(
uint4(0u));
396 horizon_tracing_tiles_buf_.resize(
ceil_to_multiple_u(raytrace_tile_count_horizon, 512));
402 float roughness_mask_start =
options.trace_max_roughness;
403 float roughness_mask_fade = 0.2f;
404 data_.roughness_mask_scale = 1.0 / roughness_mask_fade;
405 data_.roughness_mask_bias = data_.roughness_mask_scale * roughness_mask_start;
408 data_.resolution_scale = resolution_scale;
410 data_.radiance_persmat = render_view.
persmat();
411 data_.full_resolution = extent;
412 data_.full_resolution_inv = 1.0f /
float2(extent);
414 data_.horizon_resolution_scale = horizon_resolution_scale;
416 horizon_resolution_scale);
419 inst_.uniform_data.push_update();
425 const bool has_active_closure = active_closures !=
CLOSURE_NONE;
427 if (has_active_closure) {
428 inst_.manager->submit(tile_classify_ps_);
431 data_.trace_refraction = screen_radiance_back_tx !=
nullptr;
433 for (
int i = 0; i < 3; i++) {
434 result.closures[i] = trace(i, (closure_count > i),
options, rt_buffer, main_view, render_view);
437 if (has_active_closure) {
438 if (use_horizon_scan) {
442 downsampled_in_normal_tx_.acquire(tracing_res_horizon,
GPU_RGB10_A2, usage_rw);
444 horizon_radiance_tx_[0].acquire(tracing_res_horizon,
GPU_RGBA16F, usage_rw);
445 horizon_radiance_denoised_tx_[0].acquire(tracing_res_horizon,
GPU_RGBA16F, usage_rw);
447 horizon_radiance_tx_[i].acquire(tracing_res_horizon,
GPU_RGBA8, usage_rw);
448 horizon_radiance_denoised_tx_[i].acquire(tracing_res_horizon,
GPU_RGBA8, usage_rw);
451 horizon_scan_output_tx_[i] =
result.closures[i];
454 horizon_tracing_dispatch_buf_.clear_to_zero();
455 horizon_denoise_dispatch_buf_.clear_to_zero();
456 inst_.manager->submit(horizon_schedule_ps_);
458 inst_.manager->submit(horizon_setup_ps_, render_view);
459 inst_.manager->submit(horizon_scan_ps_, render_view);
460 inst_.manager->submit(horizon_denoise_ps_, render_view);
461 inst_.manager->submit(horizon_resolve_ps_, render_view);
464 horizon_radiance_tx_[i].release();
465 horizon_radiance_denoised_tx_[i].release();
467 downsampled_in_radiance_tx_.release();
468 downsampled_in_normal_tx_.release();
bool ensure_2d_array(eGPUTextureFormat format, int2 extent, int layers, eGPUTextureUsage usage=GPU_TEXTURE_USAGE_GENERAL, const float *data=nullptr, int mip_len=1)
bool ensure_2d(eGPUTextureFormat format, int2 extent, eGPUTextureUsage usage=GPU_TEXTURE_USAGE_GENERAL, const float *data=nullptr, int mip_len=1)