Commit: c1d30dbfe3a431b90ddcac6ae62481d8e57a08e5
Author: Sergey Sharybin
Date:   Thu Aug 5 12:30:56 2021 +0200
Branches: cycles-x
https://developer.blender.org/rBc1d30dbfe3a431b90ddcac6ae62481d8e57a08e5

Cycles X: Bring back per-object GI approximation AO distance

Measure no performance impact beyond noise deviation on RTX6000:
```
                                         cycles-x             new
barbershop_interior                      14.4251s             14.2849s
bmw27                                    9.5182s              9.1225s
classroom                                17.1786s             17.1967s
junkshop                                 18.3849s             18.8356s
monster                                  9.9017s              9.5428s
pabellon                                 8.0902s              8.1711s
```

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

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

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

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

diff --git a/intern/cycles/kernel/integrator/integrator_intersect_closest.h 
b/intern/cycles/kernel/integrator/integrator_intersect_closest.h
index 493e1bfc5f5..d92e097e783 100644
--- a/intern/cycles/kernel/integrator/integrator_intersect_closest.h
+++ b/intern/cycles/kernel/integrator/integrator_intersect_closest.h
@@ -152,11 +152,21 @@ ccl_device void 
integrator_intersect_closest(INTEGRATOR_STATE_ARGS)
   integrator_state_read_ray(INTEGRATOR_STATE_PASS, &ray);
   kernel_assert(ray.t != 0.0f);
 
-  uint visibility = path_state_ray_visibility(INTEGRATOR_STATE_PASS);
+  const uint visibility = path_state_ray_visibility(INTEGRATOR_STATE_PASS);
+  const int last_isect_prim = INTEGRATOR_STATE(isect, prim);
+  const int last_isect_object = INTEGRATOR_STATE(isect, object);
 
   /* Trick to use short AO rays to approximate indirect light at the end of 
the path. */
   if (path_state_ao_bounce(INTEGRATOR_STATE_PASS)) {
     ray.t = kernel_data.integrator.ao_bounces_distance;
+
+    const int last_object = last_isect_object != OBJECT_NONE ?
+                                last_isect_object :
+                                kernel_tex_fetch(__prim_object, 
last_isect_prim);
+    const float object_ao_distance = kernel_tex_fetch(__objects, 
last_object).ao_distance;
+    if (object_ao_distance != 0.0f) {
+      ray.t = object_ao_distance;
+    }
   }
 
   /* Scene Intersection. */
@@ -172,11 +182,9 @@ ccl_device void 
integrator_intersect_closest(INTEGRATOR_STATE_ARGS)
   if (kernel_data.integrator.use_lamp_mis && !(INTEGRATOR_STATE(path, flag) & 
PATH_RAY_CAMERA)) {
     /* NOTE: if we make lights visible to camera rays, we'll need to initialize
      * these in the path_state_init. */
-    const int last_prim = INTEGRATOR_STATE(isect, prim);
-    const int last_object = INTEGRATOR_STATE(isect, object);
     const int last_type = INTEGRATOR_STATE(isect, type);
 
-    hit = lights_intersect(kg, &ray, &isect, last_prim, last_object, 
last_type) || hit;
+    hit = lights_intersect(kg, &ray, &isect, last_isect_prim, 
last_isect_object, last_type) || hit;
   }
 
   /* Write intersection result into global integrator state memory. */

_______________________________________________
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