diff --git a/intern/cycles/kernel/film/data_passes.h b/intern/cycles/kernel/film/data_passes.h index 4a63d6f8e7f..3c538a74978 100644 --- a/intern/cycles/kernel/film/data_passes.h +++ b/intern/cycles/kernel/film/data_passes.h @@ -157,4 +157,47 @@ ccl_device_inline void film_write_data_passes(KernelGlobals kg, #endif } +ccl_device_inline void film_write_data_passes_background( + KernelGlobals kg, IntegratorState state, ccl_global float *ccl_restrict render_buffer) +{ +#ifdef __PASSES__ + const uint32_t path_flag = INTEGRATOR_STATE(state, path, flag); + + if (!(path_flag & PATH_RAY_TRANSPARENT_BACKGROUND)) { + return; + } + + /* Don't write data passes for paths that were split off for shadow catchers + * to avoid double-counting. */ + if (path_flag & PATH_RAY_SHADOW_CATCHER_PASS) { + return; + } + + const int flag = kernel_data.film.pass_flag; + + if (!(flag & PASS_ANY)) { + return; + } + + if (!(path_flag & PATH_RAY_SINGLE_PASS_DONE)) { + ccl_global float *buffer = film_pass_pixel_render_buffer(kg, state, render_buffer); + + if (INTEGRATOR_STATE(state, path, sample) == 0) { + if (flag & PASSMASK(DEPTH)) { + film_overwrite_pass_float(buffer + kernel_data.film.pass_depth, 0.0f); + } + if (flag & PASSMASK(OBJECT_ID)) { + film_overwrite_pass_float(buffer + kernel_data.film.pass_object_id, 0.0f); + } + if (flag & PASSMASK(MATERIAL_ID)) { + film_overwrite_pass_float(buffer + kernel_data.film.pass_material_id, 0.0f); + } + if (flag & PASSMASK(POSITION)) { + film_overwrite_pass_float3(buffer + kernel_data.film.pass_position, zero_float3()); + } + } + } +#endif +} + CCL_NAMESPACE_END diff --git a/intern/cycles/kernel/integrator/shade_background.h b/intern/cycles/kernel/integrator/shade_background.h index 8fc5689683a..f35a6d308f7 100644 --- a/intern/cycles/kernel/integrator/shade_background.h +++ b/intern/cycles/kernel/integrator/shade_background.h @@ -3,6 +3,7 @@ #pragma once +#include "kernel/film/data_passes.h" #include "kernel/film/light_passes.h" #include "kernel/integrator/guiding.h" @@ -131,6 +132,7 @@ ccl_device_inline void integrate_background(KernelGlobals kg, /* Write to render buffer. */ film_write_background(kg, state, L, transparent, is_transparent_background_ray, render_buffer); + film_write_data_passes_background(kg, state, render_buffer); } ccl_device_inline void integrate_distant_lights(KernelGlobals kg,