@@ -53,7 +53,8 @@ NR_GPU inline RayHit intersectRay(
5353 const float tMax ,
5454 const uint32_t sampleIndex = 0 ,
5555 const bool gaussianEnabled = true,
56- const bool meshVisibilityBoundEnabled = true)
56+ const bool meshVisibilityBoundEnabled = true,
57+ const uint32_t excludedGaussianId = InvalidIndex )
5758{
5859 RayHit hit {};
5960#if defined(NR_GPU_DEVICE_COMPILE )
@@ -90,7 +91,10 @@ NR_GPU inline RayHit intersectRay(
9091 const float gaussianTMax = meshHit .instanceIndex != InvalidIndex ? meshHit .t : tMax ;
9192 uint32_t payload0 = sampleIndex ;
9293 uint32_t payload1 = __float_as_uint (gaussianTMax );
93- uint32_t payload2 = InvalidIndex ;
94+ // Before acceptance payload 2 identifies a Gaussian that must not
95+ // intersect this ray. Any-hit overwrites it only when another
96+ // Gaussian is accepted.
97+ uint32_t payload2 = excludedGaussianId ;
9498 optixTraverse (
9599 accel ,
96100 make_float3 (origin .x , origin .y , origin .z ),
@@ -105,12 +109,12 @@ NR_GPU inline RayHit intersectRay(
105109 0 ,
106110 payload0 , payload1 , payload2 );
107111
108- const uint32_t gaussianId = payload2 ;
109- if (gaussianId != InvalidIndex )
112+ const float gaussianT = __uint_as_float ( payload1 ) ;
113+ if (gaussianT < gaussianTMax )
110114 {
111115 // Gaussian accepted via Russian roulette.
112- hit .instanceIndex = gaussianId ;
113- hit .t = __uint_as_float ( payload1 ) ;
116+ hit .instanceIndex = payload2 ;
117+ hit .t = gaussianT ;
114118 }
115119 else if (meshHit .instanceIndex != InvalidIndex )
116120 {
0 commit comments