[Bf-blender-cvs] [49f5a0e8964] cycles-x: Fix background "leaking" into combined in Cycles X

Sergey Sharybin noreply at git.blender.org
Wed Jul 21 10:16:40 CEST 2021


Commit: 49f5a0e89647966a73ea20569b1a2d3647ab5aa5
Author: Sergey Sharybin
Date:   Tue Jul 20 17:18:02 2021 +0200
Branches: cycles-x
https://developer.blender.org/rB49f5a0e89647966a73ea20569b1a2d3647ab5aa5

Fix background "leaking" into combined in Cycles X

Was happening when transparent film is enabled, and Environment pass
enabled.

Test file: F10230084

Differential Revision: https://developer.blender.org/D11976

===================================================================

M	intern/cycles/kernel/integrator/integrator_shade_background.h
M	intern/cycles/kernel/kernel_accumulate.h

===================================================================

diff --git a/intern/cycles/kernel/integrator/integrator_shade_background.h b/intern/cycles/kernel/integrator/integrator_shade_background.h
index 5181a5c42b4..b526ef2ec08 100644
--- a/intern/cycles/kernel/integrator/integrator_shade_background.h
+++ b/intern/cycles/kernel/integrator/integrator_shade_background.h
@@ -97,8 +97,11 @@ ccl_device_inline void integrate_background(INTEGRATOR_STATE_ARGS,
   bool eval_background = true;
   float transparent = 0.0f;
 
-  if (kernel_data.background.transparent &&
-      (INTEGRATOR_STATE(path, flag) & PATH_RAY_TRANSPARENT_BACKGROUND)) {
+  const bool is_transparent_background_ray = kernel_data.background.transparent &&
+                                             (INTEGRATOR_STATE(path, flag) &
+                                              PATH_RAY_TRANSPARENT_BACKGROUND);
+
+  if (is_transparent_background_ray) {
     transparent = average(INTEGRATOR_STATE(path, throughput));
 
 #ifdef __PASSES__
@@ -120,7 +123,8 @@ ccl_device_inline void integrate_background(INTEGRATOR_STATE_ARGS,
   }
 
   /* Write to render buffer. */
-  kernel_accum_background(INTEGRATOR_STATE_PASS, L, transparent, render_buffer);
+  kernel_accum_background(
+      INTEGRATOR_STATE_PASS, L, transparent, is_transparent_background_ray, render_buffer);
 }
 
 ccl_device_inline void integrate_distant_lights(INTEGRATOR_STATE_ARGS,
diff --git a/intern/cycles/kernel/kernel_accumulate.h b/intern/cycles/kernel/kernel_accumulate.h
index 63fdf0dc912..6e819dace31 100644
--- a/intern/cycles/kernel/kernel_accumulate.h
+++ b/intern/cycles/kernel/kernel_accumulate.h
@@ -473,6 +473,7 @@ ccl_device_inline void kernel_accum_transparent(INTEGRATOR_STATE_CONST_ARGS,
 ccl_device_inline void kernel_accum_background(INTEGRATOR_STATE_CONST_ARGS,
                                                const float3 L,
                                                const float transparent,
+                                               const bool is_transparent_background_ray,
                                                ccl_global float *ccl_restrict render_buffer)
 {
   float3 contribution = INTEGRATOR_STATE(path, throughput) * L;
@@ -481,7 +482,13 @@ ccl_device_inline void kernel_accum_background(INTEGRATOR_STATE_CONST_ARGS,
   ccl_global float *buffer = kernel_accum_pixel_render_buffer(INTEGRATOR_STATE_PASS,
                                                               render_buffer);
 
-  kernel_accum_combined_transparent_pass(INTEGRATOR_STATE_PASS, contribution, transparent, buffer);
+  if (is_transparent_background_ray) {
+    kernel_accum_transparent(INTEGRATOR_STATE_PASS, transparent, render_buffer);
+  }
+  else {
+    kernel_accum_combined_transparent_pass(
+        INTEGRATOR_STATE_PASS, contribution, transparent, buffer);
+  }
   kernel_accum_emission_or_background_pass(
       INTEGRATOR_STATE_PASS, contribution, buffer, kernel_data.film.pass_background);
 }



More information about the Bf-blender-cvs mailing list