[Bf-blender-cvs] [2ec243d2612] cycles-x: Cycles X: tweak a few functions for easier reuse in volume code

Brecht Van Lommel noreply at git.blender.org
Mon Jun 28 17:15:23 CEST 2021


Commit: 2ec243d2612253f959f8f096a968f5052d4b54b6
Author: Brecht Van Lommel
Date:   Thu Jun 17 17:27:48 2021 +0200
Branches: cycles-x
https://developer.blender.org/rB2ec243d2612253f959f8f096a968f5052d4b54b6

Cycles X: tweak a few functions for easier reuse in volume code

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

M	intern/cycles/kernel/integrator/integrator_intersect_closest.h
M	intern/cycles/kernel/integrator/integrator_shade_background.h
M	intern/cycles/kernel/integrator/integrator_shade_light.h
M	intern/cycles/kernel/integrator/integrator_shade_surface.h
M	intern/cycles/kernel/integrator/integrator_shade_volume.h
M	intern/cycles/kernel/kernel_accumulate.h
M	intern/cycles/kernel/kernel_emission.h
M	intern/cycles/kernel/kernel_shader.h

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

diff --git a/intern/cycles/kernel/integrator/integrator_intersect_closest.h b/intern/cycles/kernel/integrator/integrator_intersect_closest.h
index b0fc87f5c8d..a4538e8f771 100644
--- a/intern/cycles/kernel/integrator/integrator_intersect_closest.h
+++ b/intern/cycles/kernel/integrator/integrator_intersect_closest.h
@@ -29,20 +29,18 @@
 CCL_NAMESPACE_BEGIN
 
 template<uint32_t current_kernel>
-ccl_device_forceinline bool integrator_intersect_shader_next_kernel(
-    INTEGRATOR_STATE_ARGS, const Intersection *ccl_restrict isect)
+ccl_device_forceinline bool integrator_intersect_terminate(INTEGRATOR_STATE_ARGS,
+                                                           const Intersection *ccl_restrict isect,
+                                                           const int shader_flags)
 {
-  /* Find shader from intersection. */
-  const int shader = intersection_get_shader(kg, isect);
-  const int flags = kernel_tex_fetch(__shaders, shader).flags;
 
   /* Optional AO bounce termination. */
   if (path_state_ao_bounce(INTEGRATOR_STATE_PASS)) {
-    if (flags & (SD_HAS_TRANSPARENT_SHADOW | SD_HAS_EMISSION)) {
+    if (shader_flags & (SD_HAS_TRANSPARENT_SHADOW | SD_HAS_EMISSION)) {
       INTEGRATOR_STATE_WRITE(path, flag) |= PATH_RAY_TERMINATE_AFTER_TRANSPARENT;
     }
     else {
-      return false;
+      return true;
     }
   }
 
@@ -60,18 +58,28 @@ ccl_device_forceinline bool integrator_intersect_shader_next_kernel(
     const float terminate = path_state_rng_1D(kg, &rng_state, PRNG_TERMINATE);
 
     if (probability == 0.0f || terminate >= probability) {
-      if (flags & (SD_HAS_TRANSPARENT_SHADOW | SD_HAS_EMISSION)) {
+      if (shader_flags & (SD_HAS_TRANSPARENT_SHADOW | SD_HAS_EMISSION)) {
         /* Mark path to be terminated right after shader evaluation. */
         INTEGRATOR_STATE_WRITE(path, flag) |= PATH_RAY_TERMINATE_IMMEDIATE;
       }
       else {
-        return false;
+        return true;
       }
     }
   }
 
+  return false;
+}
+
+template<uint32_t current_kernel>
+ccl_device_forceinline void integrator_intersect_shader_next_kernel(
+    INTEGRATOR_STATE_ARGS,
+    const Intersection *ccl_restrict isect,
+    const int shader,
+    const int shader_flags)
+{
   /* Setup next kernel to execute. */
-  if (flags & SD_HAS_RAYTRACE) {
+  if (shader_flags & SD_HAS_RAYTRACE) {
     INTEGRATOR_PATH_NEXT_SORTED(
         current_kernel, DEVICE_KERNEL_INTEGRATOR_SHADE_SURFACE_RAYTRACE, shader);
   }
@@ -82,8 +90,6 @@ ccl_device_forceinline bool integrator_intersect_shader_next_kernel(
   /* Setup shadow catcher. */
   const int object_flags = intersection_get_object_flags(kg, isect);
   kernel_shadow_catcher_split(INTEGRATOR_STATE_PASS, object_flags);
-
-  return true;
 }
 
 ccl_device void integrator_intersect_closest(INTEGRATOR_STATE_ARGS)
@@ -142,8 +148,13 @@ ccl_device void integrator_intersect_closest(INTEGRATOR_STATE_ARGS)
     }
     else {
       /* Hit a surface, continue with surface kernel unless terminated. */
-      if (integrator_intersect_shader_next_kernel<DEVICE_KERNEL_INTEGRATOR_INTERSECT_CLOSEST>(
-              INTEGRATOR_STATE_PASS, &isect)) {
+      const int shader = intersection_get_shader(kg, &isect);
+      const int flags = kernel_tex_fetch(__shaders, shader).flags;
+
+      if (!integrator_intersect_terminate<DEVICE_KERNEL_INTEGRATOR_INTERSECT_CLOSEST>(
+              INTEGRATOR_STATE_PASS, &isect, flags)) {
+        integrator_intersect_shader_next_kernel<DEVICE_KERNEL_INTEGRATOR_INTERSECT_CLOSEST>(
+            INTEGRATOR_STATE_PASS, &isect, shader, flags);
         return;
       }
       else {
diff --git a/intern/cycles/kernel/integrator/integrator_shade_background.h b/intern/cycles/kernel/integrator/integrator_shade_background.h
index 49666fea536..3c310dec898 100644
--- a/intern/cycles/kernel/integrator/integrator_shade_background.h
+++ b/intern/cycles/kernel/integrator/integrator_shade_background.h
@@ -166,7 +166,8 @@ ccl_device_inline void integrate_distant_lights(INTEGRATOR_STATE_ARGS,
       }
 
       /* Write to render buffer. */
-      kernel_accum_emission(INTEGRATOR_STATE_PASS, light_eval, render_buffer);
+      const float3 throughput = INTEGRATOR_STATE(path, throughput);
+      kernel_accum_emission(INTEGRATOR_STATE_PASS, throughput, light_eval, render_buffer);
     }
   }
 }
diff --git a/intern/cycles/kernel/integrator/integrator_shade_light.h b/intern/cycles/kernel/integrator/integrator_shade_light.h
index d22fb069f1d..04c8a255664 100644
--- a/intern/cycles/kernel/integrator/integrator_shade_light.h
+++ b/intern/cycles/kernel/integrator/integrator_shade_light.h
@@ -88,7 +88,8 @@ ccl_device_inline void integrate_light(INTEGRATOR_STATE_ARGS,
   }
 
   /* Write to render buffer. */
-  kernel_accum_emission(INTEGRATOR_STATE_PASS, light_eval, render_buffer);
+  const float3 throughput = INTEGRATOR_STATE(path, throughput);
+  kernel_accum_emission(INTEGRATOR_STATE_PASS, throughput, light_eval, render_buffer);
 }
 
 ccl_device void integrator_shade_light(INTEGRATOR_STATE_ARGS,
diff --git a/intern/cycles/kernel/integrator/integrator_shade_surface.h b/intern/cycles/kernel/integrator/integrator_shade_surface.h
index 4feda3ab904..d07f6704b8c 100644
--- a/intern/cycles/kernel/integrator/integrator_shade_surface.h
+++ b/intern/cycles/kernel/integrator/integrator_shade_surface.h
@@ -94,7 +94,8 @@ ccl_device_forceinline void integrate_surface_emission(INTEGRATOR_STATE_CONST_AR
     L *= mis_weight;
   }
 
-  kernel_accum_emission(INTEGRATOR_STATE_PASS, L, render_buffer);
+  const float3 throughput = INTEGRATOR_STATE(path, throughput);
+  kernel_accum_emission(INTEGRATOR_STATE_PASS, throughput, L, render_buffer);
 }
 #endif /* __EMISSION__ */
 
diff --git a/intern/cycles/kernel/integrator/integrator_shade_volume.h b/intern/cycles/kernel/integrator/integrator_shade_volume.h
index 279f692feed..e7b0c187518 100644
--- a/intern/cycles/kernel/integrator/integrator_shade_volume.h
+++ b/intern/cycles/kernel/integrator/integrator_shade_volume.h
@@ -154,14 +154,12 @@ ccl_device void integrator_shade_volume(INTEGRATOR_STATE_ARGS,
     }
     else {
       /* Hit a surface, continue with surface kernel unless terminated. */
-      if (integrator_intersect_shader_next_kernel<DEVICE_KERNEL_INTEGRATOR_SHADE_VOLUME>(
-              INTEGRATOR_STATE_PASS, &isect)) {
-        return;
-      }
-      else {
-        INTEGRATOR_PATH_TERMINATE(DEVICE_KERNEL_INTEGRATOR_SHADE_VOLUME);
-        return;
-      }
+      const int shader = intersection_get_shader(kg, &isect);
+      const int flags = kernel_tex_fetch(__shaders, shader).flags;
+
+      integrator_intersect_shader_next_kernel<DEVICE_KERNEL_INTEGRATOR_SHADE_VOLUME>(
+          INTEGRATOR_STATE_PASS, &isect, shader, flags);
+      return;
     }
   }
 #endif /* __VOLUME__ */
diff --git a/intern/cycles/kernel/kernel_accumulate.h b/intern/cycles/kernel/kernel_accumulate.h
index 3dff2464e15..54b8ff79df5 100644
--- a/intern/cycles/kernel/kernel_accumulate.h
+++ b/intern/cycles/kernel/kernel_accumulate.h
@@ -658,10 +658,11 @@ ccl_device_inline void kernel_accum_background(INTEGRATOR_STATE_CONST_ARGS,
 
 /* Write emission to render buffer. */
 ccl_device_inline void kernel_accum_emission(INTEGRATOR_STATE_CONST_ARGS,
+                                             const float3 throughput,
                                              const float3 L,
                                              ccl_global float *ccl_restrict render_buffer)
 {
-  float3 contribution = INTEGRATOR_STATE(path, throughput) * L;
+  float3 contribution = throughput * L;
   kernel_accum_clamp(kg, &contribution, INTEGRATOR_STATE(path, bounce) - 1);
 
   ccl_global float *buffer = kernel_accum_pixel_render_buffer(INTEGRATOR_STATE_PASS,
diff --git a/intern/cycles/kernel/kernel_emission.h b/intern/cycles/kernel/kernel_emission.h
index 67469dca3b7..c5173cc2563 100644
--- a/intern/cycles/kernel/kernel_emission.h
+++ b/intern/cycles/kernel/kernel_emission.h
@@ -133,14 +133,20 @@ ccl_device_inline bool light_sample_terminate(const KernelGlobals *ccl_restrict
 }
 
 /* Create shadow ray towards light sample. */
+template<bool is_volume = false>
 ccl_device_inline void light_sample_to_shadow_ray(const ShaderData *sd,
                                                   const LightSample *ls,
                                                   Ray *ray)
 {
   if (ls->shader & SHADER_CAST_SHADOW) {
     /* setup ray */
-    bool transmit = (dot(sd->Ng, ls->D) < 0.0f);
-    ray->P = ray_offset(sd->P, (transmit) ? -sd->Ng : sd->Ng);
+    if (is_volume) {
+      ray->P = sd->P;
+    }
+    else {
+      bool transmit = (dot(sd->Ng, ls->D) < 0.0f);
+      ray->P = ray_offset(sd->P, (transmit) ? -sd->Ng : sd->Ng);
+    }
 
     if (ls->t == FLT_MAX) {
       /* distant light */
@@ -164,18 +170,4 @@ ccl_device_inline void light_sample_to_shadow_ray(const ShaderData *sd,
   ray->time = sd->time;
 }
 
-/* Volume phase evaluation code - to be moved into volume code. */
-#if 0
-#  ifdef __VOLUME__
-    float bsdf_pdf;
-    shader_volume_phase_eval(kg, sd, ls->D, eval, &bsdf_pdf);
-    if (ls->shader & SHADER_USE_MIS) {
-      /* Multiple importance sampling. */
-      float mis_weight = power_heuristic(ls->pdf, bsdf_pdf);
-      light_eval *= mis_weight;
-    }
-  }
-#  endif
-#endif
-
 CCL_NAMESPACE_END
diff --git a/intern/cycles/kernel/kernel_shader.h b/intern/cycles/kernel/kernel_shader.h
index ab9f6e7c540..ee27bab3f8c 100644
--- a/intern/cycles/kernel/kernel_shader.h
+++ b/intern/cycles/kernel/kernel_shader.h
@@ -1098,13 +1098,19 @@ ccl_device void shader_volume_phase_eval(const KernelGlobals *kg,
                                          const ShaderData *sd,
                                          const float3 omega_in,
                                          BsdfEval *eval,
-                                         float *pdf)
+                                         const float light_pdf,
+                                         const uint light_shader_flags)
 {
   PROFILING_INIT(kg, PROFILING_CLOSURE_VOLUME_EVAL);
 
   bsdf_eval_init(eval, false, zero_float3(), kernel_data.film.use_light_pass);
 
-  _shader_volume_phase_multi_eval(sd, omega_in, pdf, -1, eval, 0.0f, 0.0f);
+  float pdf;
+  _shader_volu

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list