[Bf-blender-cvs] [1a27728dc8c] cycles_path_guiding: Guiding: fixing RIS sampling

Sebastian Herholz noreply at git.blender.org
Thu Jan 26 20:15:06 CET 2023


Commit: 1a27728dc8c54db6a9bfeb66ee9ee2800258ed3b
Author: Sebastian Herholz
Date:   Mon Jan 23 17:25:49 2023 +0100
Branches: cycles_path_guiding
https://developer.blender.org/rB1a27728dc8c54db6a9bfeb66ee9ee2800258ed3b

Guiding: fixing RIS sampling

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

M	intern/cycles/kernel/integrator/surface_shader.h

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

diff --git a/intern/cycles/kernel/integrator/surface_shader.h b/intern/cycles/kernel/integrator/surface_shader.h
index 23e30c3e3f4..56707523f33 100644
--- a/intern/cycles/kernel/integrator/surface_shader.h
+++ b/intern/cycles/kernel/integrator/surface_shader.h
@@ -21,7 +21,7 @@
 
 CCL_NAMESPACE_BEGIN
 
-//#define RIS_COSINE
+#define RIS_COSINE
 
 /* Guiding */
 
@@ -571,18 +571,22 @@ ccl_device int surface_shader_bsdf_guided_sample_closure_ris(KernelGlobals kg,
     rand_guiding_bsdf_ris[0] = path_state_rng_2D(kg, rng_state, PRNG_SURFACE_RIS_GUIDING_0);
     rand_guiding_bsdf_ris[1] = path_state_rng_2D(kg, rng_state, PRNG_SURFACE_RIS_GUIDING_1);
 
+    float pi_factor = 2.0f;
+
     float2 sampled_rougness_ris[2];
     float eta_ris[2];
     int label_ris[2];
 
     float3 omega_in_ris[2];
-    float ris_pdfs[2];
-    float guide_pdfs[2];
-    float bsdf_pdfs[2];
-    float cosines[2];
+    float ris_pdfs[2] = {0.f, 0.f};
+    float guide_pdfs[2] = {0.f, 0.f};
+    float bsdf_pdfs[2] = {0.f, 0.f};
+    float cosines[2] = {0.f, 0.f};
     BsdfEval bsdf_evals[2];
-    float avg_bsdf_evals[2];
-    Spectrum evals[2];
+    float avg_bsdf_evals[2] = {0.f, 0.f};
+    Spectrum evals[2] = {zero_spectrum(), zero_spectrum()};
+
+    int ris_idx = 0;
 
     // RIS0 - sample BSDF
     label_ris[0] = bsdf_sample(kg,
@@ -597,18 +601,20 @@ ccl_device int surface_shader_bsdf_guided_sample_closure_ris(KernelGlobals kg,
                                &eta_ris[0]);
 
     bsdf_eval_init(&bsdf_evals[0], sc->type, evals[0] * sc->weight);
-    cosines[0] = max(0.01f, fabsf(dot(sd->N, omega_in_ris[0])));
-    if (sd->num_closure > 1) {
-      float sweight = sc->sample_weight;
-      bsdf_pdfs[0] = _surface_shader_bsdf_eval_mis(
-          kg, sd, omega_in_ris[0], sc, &bsdf_evals[0], (bsdf_pdfs[0]) * sweight, sweight, 0);
-      kernel_assert(reduce_min(bsdf_eval_sum(&bsdf_evals[0])) >= 0.0f);
+    if(bsdf_pdfs[0] > 0.f)
+    {
+      cosines[0] = max(0.01f, fabsf(dot(sd->N, omega_in_ris[0])));
+      if (sd->num_closure > 1) {
+        float sweight = sc->sample_weight;
+        bsdf_pdfs[0] = _surface_shader_bsdf_eval_mis(
+            kg, sd, omega_in_ris[0], sc, &bsdf_evals[0], (bsdf_pdfs[0]) * sweight, sweight, 0);
+        kernel_assert(reduce_min(bsdf_eval_sum(&bsdf_evals[0])) >= 0.0f);
+      }
+      avg_bsdf_evals[0] = (bsdf_evals[0].sum[0] + bsdf_evals[0].sum[1] + bsdf_evals[0].sum[2]) /
+                          3.0f;
+      guide_pdfs[0] = guiding_bsdf_pdf(kg, state, omega_in_ris[0]);
+      bsdf_pdfs[0] = max(0.f, bsdf_pdfs[0]);
     }
-    avg_bsdf_evals[0] = (bsdf_evals[0].sum[0] + bsdf_evals[0].sum[1] + bsdf_evals[0].sum[2]) /
-                        3.0f;
-    guide_pdfs[0] = guiding_bsdf_pdf(kg, state, omega_in_ris[0]);
-    bsdf_pdfs[0] = max(0.f, bsdf_pdfs[0]);
-
     // assert(bsdf_pdfs[0] >= 1e-20f);
     // assert(guide_pdfs[0] >= 1e-20f);
 
@@ -635,12 +641,12 @@ ccl_device int surface_shader_bsdf_guided_sample_closure_ris(KernelGlobals kg,
     if (avg_bsdf_evals[0] > 0.f && bsdf_pdfs[0] > 1e-10f && guide_pdfs[0] > 0.f) {
 #  ifdef RIS_COSINE
       ris_pdfs[0] = (avg_bsdf_evals[0] / cosines[0] *
-                     (0.5f * ((1.0f / (4.0f * float(M_PI))) + guide_pdfs[0]))) /
+                     (0.5f * ((1.0f / (pi_factor * float(M_PI))) + guide_pdfs[0]))) /
                     (0.5f * (bsdf_pdfs[0] + guide_pdfs[0]));
       //(0.5f * (bsdf_pdfs[0] + bsdf_pdfs[0]));
 #  else
       ris_pdfs[0] = (avg_bsdf_evals[0] *
-                     (0.5f * ((1.0f / (4.0f * float(M_PI))) + guide_pdfs[0]))) /
+                     (0.5f * ((1.0f / (pi_factor * float(M_PI))) + guide_pdfs[0]))) /
                     (0.5f * (bsdf_pdfs[0] + guide_pdfs[0]));
 #  endif
       sum_ris_pdfs += ris_pdfs[0];
@@ -650,15 +656,15 @@ ccl_device int surface_shader_bsdf_guided_sample_closure_ris(KernelGlobals kg,
       ris_pdfs[0] = 0.f;
     }
     assert(sum_ris_pdfs >= 0.f);
-    /* */
+
     if (avg_bsdf_evals[1] > 0.f && bsdf_pdfs[1] > 1e-10f && guide_pdfs[1] > 0.f) {
 #  ifdef RIS_COSINE
       ris_pdfs[1] = (avg_bsdf_evals[1] / cosines[1] *
-                     (0.5f * ((1.0f / (4.0f * float(M_PI))) + guide_pdfs[1]))) /
+                     (0.5f * ((1.0f / (pi_factor * float(M_PI))) + guide_pdfs[1]))) /
                     (0.5f * (bsdf_pdfs[1] + guide_pdfs[1]));
 #  else
       ris_pdfs[1] = (avg_bsdf_evals[1] *
-                     (0.5f * ((1.0f / (4.0f * float(M_PI))) + guide_pdfs[1]))) /
+                     (0.5f * ((1.0f / (pi_factor * float(M_PI))) + guide_pdfs[1]))) /
                     (0.5f * (bsdf_pdfs[1] + guide_pdfs[1]));
 #  endif
       sum_ris_pdfs += ris_pdfs[1];
@@ -668,17 +674,16 @@ ccl_device int surface_shader_bsdf_guided_sample_closure_ris(KernelGlobals kg,
       ris_pdfs[1] = 0.f;
     }
     assert(sum_ris_pdfs >= 0.f);
-    /* */
+
     if (num_samples == 0 || !(sum_ris_pdfs > 1e-10f)) {
       *bsdf_pdf = 0.0f;
       *mis_pdf = 0.0f;
       return label;
     }
 
-    /**/
+
     float rand_ris_select = rand_bsdf_guiding * sum_ris_pdfs;
-    int ris_idx = 0;
-    /* */
+
     float sum_ris = 0.0f;
     for (int i = 0; i < 2; i++) {
       sum_ris += ris_pdfs[i];
@@ -687,17 +692,18 @@ ccl_device int surface_shader_bsdf_guided_sample_closure_ris(KernelGlobals kg,
         break;
       }
     }
-    /**/
+
     assert(sum_ris_pdfs >= 0.f);
 
     assert(ris_idx < 2);
+
 #  ifdef RIS_COSINE
     guide_pdf = (avg_bsdf_evals[ris_idx] / cosines[ris_idx] *
-                 (0.5f * ((1.0f / (4.0f * float(M_PI))) + guide_pdfs[ris_idx]))) *
+                 (0.5f * ((1.0f / (pi_factor * float(M_PI))) + guide_pdfs[ris_idx]))) *
                 (float(2) / sum_ris_pdfs);
 #  else
     guide_pdf = (avg_bsdf_evals[ris_idx] *
-                 (0.5f * ((1.0f / (4.0f * float(M_PI))) + guide_pdfs[ris_idx]))) *
+                 (0.5f * ((1.0f / (pi_factor * float(M_PI))) + guide_pdfs[ris_idx]))) *
                 (float(2) / sum_ris_pdfs);
 #  endif
     *unguided_bsdf_pdf = bsdf_pdfs[ris_idx];
@@ -753,6 +759,9 @@ ccl_device int surface_shader_bsdf_guided_sample_closure_ris(KernelGlobals kg,
         idx = (rnd > sum_pdfs) ? sd->num_closure - 1 : idx;
 
         label = bsdf_label(kg, &sd->closure[idx], *omega_in);
+        bsdf_roughness_eta(kg, &sd->closure[idx],
+                                          sampled_rougness,
+                                          eta);
       }
     }
 
@@ -760,8 +769,6 @@ ccl_device int surface_shader_bsdf_guided_sample_closure_ris(KernelGlobals kg,
     assert(*bsdf_pdf >= 0.f);
     kernel_assert(reduce_min(bsdf_eval_sum(bsdf_eval)) >= 0.0f);
 
-    //*sampled_rougness = make_float2(1.0f, 1.0f);
-    //*eta = 1.0f;
   }
   else {
     /* Sample BSDF. */



More information about the Bf-blender-cvs mailing list