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_);
65 pass.bind_resources(inst_.
gbuffer);
66 pass.dispatch(&tile_classify_dispatch_size_);
73 pass.specialize_constant(sh,
"closure_index", &data_.
closure_index);
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_);
90 pass.specialize_constant(sh,
"closure_index", &data_.
closure_index);
93 pass.bind_image(
"out_ray_data_img", &ray_data_tx_);
94 pass.bind_ssbo(
"tiles_coord_buf", &raytrace_tracing_tiles_buf_);
97 pass.bind_resources(inst_.
gbuffer);
98 pass.dispatch(raytrace_tracing_dispatch_buf_);
107 pass.specialize_constant(sh,
"closure_index", &data_.
closure_index);
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_);
113 pass.bind_texture(
"depth_tx", &depth_tx);
115 pass.bind_resources(inst_.
sampling);
119 pass.bind_resources(inst_.
gbuffer);
121 pass.dispatch(raytrace_tracing_dispatch_buf_);
128 pass.specialize_constant(
130 pass.specialize_constant(sh,
"closure_index", &data_.
closure_index);
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_);
141 pass.bind_texture(
"depth_tx", &depth_tx);
142 pass.bind_image(
"ray_radiance_img", &ray_radiance_tx_);
144 pass.bind_resources(inst_.
sampling);
147 pass.bind_resources(inst_.
gbuffer);
148 pass.dispatch(raytrace_tracing_dispatch_buf_);
155 pass.specialize_constant(sh,
"closure_index", &data_.
closure_index);
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_);
161 pass.bind_texture(
"depth_tx", &depth_tx);
165 pass.bind_resources(inst_.
sampling);
166 pass.bind_resources(inst_.
gbuffer);
167 pass.dispatch(raytrace_tracing_dispatch_buf_);
175 pass.specialize_constant(sh,
"closure_index", &data_.
closure_index);
176 pass.specialize_constant(sh,
"raytrace_resolution_scale", &data_.
resolution_scale);
177 pass.specialize_constant(sh,
"skip_denoise",
reinterpret_cast<bool *
>(&data_.
skip_denoise));
179 pass.bind_ssbo(
"tiles_coord_buf", &raytrace_denoise_tiles_buf_);
181 pass.bind_texture(
"depth_tx", &depth_tx);
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_);
190 pass.bind_resources(inst_.
sampling);
191 pass.bind_resources(inst_.
gbuffer);
192 pass.dispatch(raytrace_denoise_dispatch_buf_);
199 pass.specialize_constant(sh,
"closure_index", &data_.
closure_index);
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_);
205 pass.bind_texture(
"depth_tx", &depth_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_);
212 pass.bind_resources(inst_.
sampling);
213 pass.dispatch(raytrace_denoise_dispatch_buf_);
220 pass.specialize_constant(sh,
"closure_index", &data_.
closure_index);
222 pass.bind_texture(
"depth_tx", &depth_tx);
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_);
229 pass.bind_resources(inst_.
sampling);
230 pass.bind_resources(inst_.
gbuffer);
231 pass.dispatch(raytrace_denoise_dispatch_buf_);
239 pass.specialize_constant(sh,
"closure_index", 0);
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_);
257 pass.bind_texture(
"depth_tx", &depth_tx);
260 pass.bind_image(
"out_radiance_img", &downsampled_in_radiance_tx_);
261 pass.bind_image(
"out_normal_img", &downsampled_in_normal_tx_);
263 pass.bind_resources(inst_.
gbuffer);
264 pass.dispatch(&horizon_tracing_dispatch_size_);
271 pass.specialize_constant(sh,
"fast_gi_slice_count", fast_gi_ray_count_);
272 pass.specialize_constant(sh,
"fast_gi_step_count", fast_gi_step_count_);
273 pass.specialize_constant(sh,
"fast_gi_ao_only", fast_gi_ao_only_);
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_);
285 pass.bind_resources(inst_.
sampling);
286 pass.bind_resources(inst_.
gbuffer);
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_);
306 pass.bind_resources(inst_.
sampling);
308 pass.dispatch(horizon_tracing_dispatch_buf_);
316 pass.bind_texture(
"depth_tx", &depth_tx);
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_);
327 pass.bind_resources(inst_.
sampling);
328 pass.bind_resources(inst_.
gbuffer);
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(
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;
402 float roughness_mask_start =
options.trace_max_roughness;
403 float roughness_mask_fade = 0.2f;
416 horizon_resolution_scale);
425 const bool has_active_closure = active_closures !=
CLOSURE_NONE;
427 if (has_active_closure) {
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) {
448 horizon_radiance_denoised_tx_[i].
acquire(tracing_res_horizon,
GPU_RGBA8, usage_rw);
451 horizon_scan_output_tx_[i] = result.closures[i];
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();