[Bf-blender-cvs] [76b6ede1a02] cycles-x: Cleanup: move all MIS weighting to integrator/ module

Brecht Van Lommel noreply at git.blender.org
Mon Jul 19 18:36:17 CEST 2021


Commit: 76b6ede1a022e58b97510061874cc5da35c3833f
Author: Brecht Van Lommel
Date:   Mon Jul 19 12:48:46 2021 +0200
Branches: cycles-x
https://developer.blender.org/rB76b6ede1a022e58b97510061874cc5da35c3833f

Cleanup: move all MIS weighting to integrator/ module

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

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

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

diff --git a/intern/cycles/kernel/integrator/integrator_shade_surface.h b/intern/cycles/kernel/integrator/integrator_shade_surface.h
index f0607138db7..5674420eeae 100644
--- a/intern/cycles/kernel/integrator/integrator_shade_surface.h
+++ b/intern/cycles/kernel/integrator/integrator_shade_surface.h
@@ -144,9 +144,14 @@ ccl_device_forceinline void integrate_surface_direct_light(INTEGRATOR_STATE_ARGS
   const bool is_transmission = shader_bsdf_is_transmission(sd, ls.D);
 
   BsdfEval bsdf_eval ccl_optional_struct_init;
-  shader_bsdf_eval(kg, sd, ls.D, is_transmission, &bsdf_eval, ls.pdf, ls.shader);
+  const float bsdf_pdf = shader_bsdf_eval(kg, sd, ls.D, is_transmission, &bsdf_eval, ls.shader);
   bsdf_eval_mul3(&bsdf_eval, light_eval / ls.pdf);
 
+  if (ls.shader & SHADER_USE_MIS) {
+    const float mis_weight = power_heuristic(ls.pdf, bsdf_pdf);
+    bsdf_eval_mul(&bsdf_eval, mis_weight);
+  }
+
   /* Path termination. */
   const float terminate = path_state_rng_light_termination(kg, rng_state);
   if (light_sample_terminate(kg, &ls, &bsdf_eval, terminate)) {
diff --git a/intern/cycles/kernel/integrator/integrator_shade_volume.h b/intern/cycles/kernel/integrator/integrator_shade_volume.h
index d01f3b6cc71..6b86e5f5388 100644
--- a/intern/cycles/kernel/integrator/integrator_shade_volume.h
+++ b/intern/cycles/kernel/integrator/integrator_shade_volume.h
@@ -560,7 +560,12 @@ ccl_device_forceinline void integrate_volume_direct_light(INTEGRATOR_STATE_ARGS,
 
   /* Evaluate BSDF. */
   BsdfEval phase_eval ccl_optional_struct_init;
-  shader_volume_phase_eval(kg, sd, ls.D, &phase_eval, ls.pdf, ls.shader);
+  const float phase_pdf = shader_volume_phase_eval(kg, sd, ls.D, &phase_eval);
+
+  if (ls.shader & SHADER_USE_MIS) {
+    float mis_weight = power_heuristic(ls.pdf, phase_pdf);
+    bsdf_eval_mul(&phase_eval, mis_weight);
+  }
 
   bsdf_eval_mul3(&phase_eval, light_eval / ls.pdf);
 
diff --git a/intern/cycles/kernel/kernel_shader.h b/intern/cycles/kernel/kernel_shader.h
index 831e930b792..0e55a8099fa 100644
--- a/intern/cycles/kernel/kernel_shader.h
+++ b/intern/cycles/kernel/kernel_shader.h
@@ -609,16 +609,15 @@ ccl_device_forceinline bool _shader_bsdf_exclude(ClosureType type, uint light_sh
   return false;
 }
 
-ccl_device_inline void _shader_bsdf_multi_eval(const KernelGlobals *kg,
-                                               ShaderData *sd,
-                                               const float3 omega_in,
-                                               const bool is_transmission,
-                                               float *pdf,
-                                               const ShaderClosure *skip_sc,
-                                               BsdfEval *result_eval,
-                                               float sum_pdf,
-                                               float sum_sample_weight,
-                                               const uint light_shader_flags)
+ccl_device_inline float _shader_bsdf_multi_eval(const KernelGlobals *kg,
+                                                ShaderData *sd,
+                                                const float3 omega_in,
+                                                const bool is_transmission,
+                                                const ShaderClosure *skip_sc,
+                                                BsdfEval *result_eval,
+                                                float sum_pdf,
+                                                float sum_sample_weight,
+                                                const uint light_shader_flags)
 {
   /* this is the veach one-sample model with balance heuristic, some pdf
    * factors drop out when using balance heuristic weighting */
@@ -646,7 +645,7 @@ ccl_device_inline void _shader_bsdf_multi_eval(const KernelGlobals *kg,
     }
   }
 
-  *pdf = (sum_sample_weight > 0.0f) ? sum_pdf / sum_sample_weight : 0.0f;
+  return (sum_sample_weight > 0.0f) ? sum_pdf / sum_sample_weight : 0.0f;
 }
 
 #ifndef __KERNEL_CUDA__
@@ -654,26 +653,20 @@ ccl_device
 #else
 ccl_device_inline
 #endif
-    void
+    float
     shader_bsdf_eval(const KernelGlobals *kg,
                      ShaderData *sd,
                      const float3 omega_in,
                      const bool is_transmission,
-                     BsdfEval *eval,
-                     const float light_pdf,
+                     BsdfEval *bsdf_eval,
                      const uint light_shader_flags)
 {
   PROFILING_INIT(kg, PROFILING_CLOSURE_EVAL);
 
-  bsdf_eval_init(eval, false, zero_float3(), kernel_data.film.use_light_pass);
+  bsdf_eval_init(bsdf_eval, false, zero_float3(), kernel_data.film.use_light_pass);
 
-  float pdf;
-  _shader_bsdf_multi_eval(
-      kg, sd, omega_in, is_transmission, &pdf, NULL, eval, 0.0f, 0.0f, light_shader_flags);
-  if (light_shader_flags & SHADER_USE_MIS) {
-    float weight = power_heuristic(light_pdf, pdf);
-    bsdf_eval_mul(eval, weight);
-  }
+  return _shader_bsdf_multi_eval(
+      kg, sd, omega_in, is_transmission, NULL, bsdf_eval, 0.0f, 0.0f, light_shader_flags);
 }
 
 /* Randomly sample a BSSRDF or BSDF proportional to ShaderClosure.sample_weight. */
@@ -771,8 +764,8 @@ ccl_device int shader_bsdf_sample_closure(const KernelGlobals *kg,
     if (sd->num_closure > 1) {
       const bool is_transmission = shader_bsdf_is_transmission(sd, *omega_in);
       float sweight = sc->sample_weight;
-      _shader_bsdf_multi_eval(
-          kg, sd, *omega_in, is_transmission, pdf, sc, bsdf_eval, *pdf * sweight, sweight, 0);
+      *pdf = _shader_bsdf_multi_eval(
+          kg, sd, *omega_in, is_transmission, sc, bsdf_eval, *pdf * sweight, sweight, 0);
     }
   }
 
@@ -1075,13 +1068,12 @@ ccl_device void shader_eval_surface(INTEGRATOR_STATE_CONST_ARGS,
 
 #ifdef __VOLUME__
 
-ccl_device_inline void _shader_volume_phase_multi_eval(const ShaderData *sd,
-                                                       const float3 omega_in,
-                                                       float *pdf,
-                                                       int skip_phase,
-                                                       BsdfEval *result_eval,
-                                                       float sum_pdf,
-                                                       float sum_sample_weight)
+ccl_device_inline float _shader_volume_phase_multi_eval(const ShaderData *sd,
+                                                        const float3 omega_in,
+                                                        int skip_phase,
+                                                        BsdfEval *result_eval,
+                                                        float sum_pdf,
+                                                        float sum_sample_weight)
 {
   for (int i = 0; i < sd->num_closure; i++) {
     if (i == skip_phase)
@@ -1102,26 +1094,19 @@ ccl_device_inline void _shader_volume_phase_multi_eval(const ShaderData *sd,
     }
   }
 
-  *pdf = (sum_sample_weight > 0.0f) ? sum_pdf / sum_sample_weight : 0.0f;
+  return (sum_sample_weight > 0.0f) ? sum_pdf / sum_sample_weight : 0.0f;
 }
 
-ccl_device void shader_volume_phase_eval(const KernelGlobals *kg,
-                                         const ShaderData *sd,
-                                         const float3 omega_in,
-                                         BsdfEval *eval,
-                                         const float light_pdf,
-                                         const uint light_shader_flags)
+ccl_device float shader_volume_phase_eval(const KernelGlobals *kg,
+                                          const ShaderData *sd,
+                                          const float3 omega_in,
+                                          BsdfEval *phase_eval)
 {
   PROFILING_INIT(kg, PROFILING_CLOSURE_VOLUME_EVAL);
 
-  bsdf_eval_init(eval, false, zero_float3(), kernel_data.film.use_light_pass);
+  bsdf_eval_init(phase_eval, false, zero_float3(), kernel_data.film.use_light_pass);
 
-  float pdf;
-  _shader_volume_phase_multi_eval(sd, omega_in, &pdf, -1, eval, 0.0f, 0.0f);
-  if (light_shader_flags & SHADER_USE_MIS) {
-    float weight = power_heuristic(light_pdf, pdf);
-    bsdf_eval_mul(eval, weight);
-  }
+  return _shader_volume_phase_multi_eval(sd, omega_in, -1, phase_eval, 0.0f, 0.0f);
 }
 
 ccl_device int shader_volume_phase_sample(const KernelGlobals *kg,



More information about the Bf-blender-cvs mailing list