Commit: 357ca8f128b29542138ea818e2c7ceba28efe7cf
Author: Jeffrey Liu
Date:   Thu Aug 4 13:47:54 2022 -0400
Branches: soc-2022-many-lights-sampling
https://developer.blender.org/rB357ca8f128b29542138ea818e2c7ceba28efe7cf

Fix: light tree handles spotlights poorly

This fix has a special case for spotlights, which will check if the
point falls within the spotlight or not.

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

M       intern/cycles/kernel/light/light_tree.h

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

diff --git a/intern/cycles/kernel/light/light_tree.h 
b/intern/cycles/kernel/light/light_tree.h
index decf7db8fe8..d44ed34cb15 100644
--- a/intern/cycles/kernel/light/light_tree.h
+++ b/intern/cycles/kernel/light/light_tree.h
@@ -119,7 +119,31 @@ ccl_device float 
light_tree_emitter_reservoir_weight(KernelGlobals kg,
       return 0.0f;
     }
 
-    sampled = light_sample<false>(kg, lamp, randu, randv, P, path_flag, &ls);
+    const ccl_global KernelLight *klight = &kernel_data_fetch(lights, lamp);
+
+    if (klight->type == LIGHT_SPOT) {
+      /* to-do: since spot light importance sampling isn't the best,
+       * we have a special case to check that the point is inside the cone. */
+      const float radius = klight->spot.radius;
+      const float cos_theta = klight->spot.spot_angle;
+      const float theta = fast_acosf(cos_theta);
+      const float3 light_P = make_float3(klight->co[0], klight->co[1], 
klight->co[2]);
+      const float3 light_dir = make_float3(
+          klight->spot.dir[0], klight->spot.dir[1], klight->spot.dir[2]);
+
+      const float h1 = radius * fast_sinf(theta);
+      const float d1 = radius * cos_theta;
+      const float h2 = d1 / fast_tanf(theta);
+
+      const float3 apex = light_P - (h1 + h2) * light_dir;
+      const float3 apex_to_point = normalize(P - apex);
+      if (dot(apex_to_point, light_dir) < cos_theta) {
+        return 0.0f;
+      }
+    }
+    else {
+      sampled = light_sample<false>(kg, lamp, randu, randv, P, path_flag, &ls);
+    }
   }

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
List details, subscription details or unsubscribe:
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to