[Bf-blender-cvs] [d18a3b728b4] cycles-x: Cycles X: improve denoising features for volumes

Brecht Van Lommel noreply at git.blender.org
Mon Sep 6 14:25:37 CEST 2021


Commit: d18a3b728b439cb754e96ab69ee0de8417fb37cc
Author: Brecht Van Lommel
Date:   Fri Sep 3 17:45:10 2021 +0200
Branches: cycles-x
https://developer.blender.org/rBd18a3b728b439cb754e96ab69ee0de8417fb37cc

Cycles X: improve denoising features for volumes

* Write accumulated volume albedo along ray
* Write view direction as normal
* Fix incorrect write of surface albedo after volume scatter

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

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

M	intern/cycles/kernel/integrator/integrator_shade_surface.h
M	intern/cycles/kernel/integrator/integrator_shade_volume.h
M	intern/cycles/kernel/kernel_passes.h

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

diff --git a/intern/cycles/kernel/integrator/integrator_shade_surface.h b/intern/cycles/kernel/integrator/integrator_shade_surface.h
index 31d76a44f7e..73b7cad32be 100644
--- a/intern/cycles/kernel/integrator/integrator_shade_surface.h
+++ b/intern/cycles/kernel/integrator/integrator_shade_surface.h
@@ -431,7 +431,7 @@ ccl_device bool integrate_surface(INTEGRATOR_STATE_ARGS,
     }
 
 #ifdef __DENOISING_FEATURES__
-    kernel_write_denoising_features(INTEGRATOR_STATE_PASS, &sd, render_buffer);
+    kernel_write_denoising_features_surface(INTEGRATOR_STATE_PASS, &sd, render_buffer);
 #endif
 
 #ifdef __SHADOW_CATCHER__
diff --git a/intern/cycles/kernel/integrator/integrator_shade_volume.h b/intern/cycles/kernel/integrator/integrator_shade_volume.h
index aea8e1f9b78..4a864b1e6ce 100644
--- a/intern/cycles/kernel/integrator/integrator_shade_volume.h
+++ b/intern/cycles/kernel/integrator/integrator_shade_volume.h
@@ -16,6 +16,13 @@
 
 #pragma once
 
+#include "kernel/kernel_accumulate.h"
+#include "kernel/kernel_emission.h"
+#include "kernel/kernel_light.h"
+#include "kernel/kernel_passes.h"
+#include "kernel/kernel_path_state.h"
+#include "kernel/kernel_shader.h"
+
 #include "kernel/integrator/integrator_intersect_closest.h"
 #include "kernel/integrator/integrator_volume_stack.h"
 
@@ -559,6 +566,13 @@ ccl_device_forceinline void volume_integrate_heterogeneous(
         ray, equiangular_light_P, vstate.rscatter, &vstate.equiangular_pdf);
   }
 
+#  ifdef __DENOISING_FEATURES__
+  const bool write_denoising_features = (INTEGRATOR_STATE(path, flag) &
+                                         PATH_RAY_DENOISING_FEATURES);
+  float3 accum_albedo = zero_float3();
+#  endif
+  float3 accum_emission = zero_float3();
+
   for (int i = 0; i < max_steps; i++) {
     /* Advance to new position */
     vstate.end_t = min(ray->t, (i + steps_offset) * step_size);
@@ -581,16 +595,22 @@ ccl_device_forceinline void volume_integrate_heterogeneous(
         /* Only write emission before indirect light scatter position, since we terminate
          * stepping at that point if we have already found a direct light scatter position. */
         if (!result.indirect_scatter) {
-          /* TODO: write only once to avoid overhead of atomics? */
           const float3 emission = volume_emission_integrate(
               &coeff, closure_flag, transmittance, dt);
-          kernel_accum_emission(
-              INTEGRATOR_STATE_PASS, result.indirect_throughput, emission, render_buffer);
+          accum_emission += emission;
         }
       }
 
       if (closure_flag & SD_EXTINCTION) {
         if ((closure_flag & SD_SCATTER) || !vstate.absorption_only) {
+#  ifdef __DENOISING_FEATURES__
+          /* Accumulate albedo for denoising features. */
+          if (write_denoising_features && (closure_flag & SD_SCATTER)) {
+            const float3 albedo = safe_divide_color(coeff.sigma_s, coeff.sigma_t);
+            accum_albedo += result.indirect_throughput * albedo * (one_float3() - transmittance);
+          }
+#  endif
+
           /* Scattering and absorption. */
           volume_integrate_step_scattering(
               sd, ray, equiangular_light_P, coeff, transmittance, vstate, result);
@@ -627,6 +647,20 @@ ccl_device_forceinline void volume_integrate_heterogeneous(
       break;
     }
   }
+
+  /* Write accumulated emisison. */
+  if (!is_zero(accum_emission)) {
+    kernel_accum_emission(
+        INTEGRATOR_STATE_PASS, result.indirect_throughput, accum_emission, render_buffer);
+  }
+
+#  ifdef __DENOISING_FEATURES__
+  /* Write denoising features. */
+  if (write_denoising_features) {
+    kernel_write_denoising_features_volume(
+        INTEGRATOR_STATE_PASS, accum_albedo, result.indirect_scatter, render_buffer);
+  }
+#  endif /* __DENOISING_FEATURES__ */
 }
 
 #  ifdef __EMISSION__
diff --git a/intern/cycles/kernel/kernel_passes.h b/intern/cycles/kernel/kernel_passes.h
index a67dc6f6391..67466b28170 100644
--- a/intern/cycles/kernel/kernel_passes.h
+++ b/intern/cycles/kernel/kernel_passes.h
@@ -35,7 +35,7 @@ ccl_device_forceinline ccl_global float *kernel_pass_pixel_render_buffer(
 
 #ifdef __DENOISING_FEATURES__
 
-ccl_device_forceinline void kernel_write_denoising_features(
+ccl_device_forceinline void kernel_write_denoising_features_surface(
     INTEGRATOR_STATE_ARGS, const ShaderData *sd, ccl_global float *ccl_restrict render_buffer)
 {
   if (!(INTEGRATOR_STATE(path, flag) & PATH_RAY_DENOISING_FEATURES)) {
@@ -120,6 +120,31 @@ ccl_device_forceinline void kernel_write_denoising_features(
     INTEGRATOR_STATE_WRITE(path, denoising_feature_throughput) *= specular_albedo;
   }
 }
+
+ccl_device_forceinline void kernel_write_denoising_features_volume(INTEGRATOR_STATE_ARGS,
+                                                                   const float3 albedo,
+                                                                   const bool scatter,
+                                                                   ccl_global float *ccl_restrict
+                                                                       render_buffer)
+{
+  ccl_global float *buffer = kernel_pass_pixel_render_buffer(INTEGRATOR_STATE_PASS, render_buffer);
+  const float3 denoising_feature_throughput = INTEGRATOR_STATE(path, denoising_feature_throughput);
+
+  if (scatter && kernel_data.film.pass_denoising_normal != PASS_UNUSED) {
+    /* Assume scatter is sufficiently diffuse to stop writing denoising features. */
+    INTEGRATOR_STATE_WRITE(path, flag) &= ~PATH_RAY_DENOISING_FEATURES;
+
+    /* Write view direction as normal. */
+    const float3 denoising_normal = make_float3(0.0f, 0.0f, -1.0f);
+    kernel_write_pass_float3(buffer + kernel_data.film.pass_denoising_normal, denoising_normal);
+  }
+
+  if (kernel_data.film.pass_denoising_albedo != PASS_UNUSED) {
+    /* Write albedo. */
+    const float3 denoising_albedo = ensure_finite3(denoising_feature_throughput * albedo);
+    kernel_write_pass_float3(buffer + kernel_data.film.pass_denoising_albedo, denoising_albedo);
+  }
+}
 #endif /* __DENOISING_FEATURES__ */
 
 #ifdef __SHADOW_CATCHER__



More information about the Bf-blender-cvs mailing list