@@ -23,7 +23,7 @@ extern "C" __global__ void __raygen__main()
2323 const uint3 dim = optixGetLaunchDimensions ();
2424 const uint64_t linear_idx = idx.z * dim.y * dim.x + idx.y * dim.x + idx.x ;
2525
26- unsigned int t, nx, ny, nz;
26+ unsigned int t, nx, ny, nz, prim_id, inst_id ;
2727 Ray ray = params.rays [linear_idx];
2828 optixTrace (
2929 params.handle ,
@@ -40,7 +40,9 @@ extern "C" __global__ void __raygen__main()
4040 t,
4141 nx,
4242 ny,
43- nz
43+ nz,
44+ prim_id,
45+ inst_id
4446 );
4547
4648 Hit hit;
@@ -49,6 +51,14 @@ extern "C" __global__ void __raygen__main()
4951 hit.geom_normal .y = int_as_float ( ny );
5052 hit.geom_normal .z = int_as_float ( nz );
5153 params.hits [linear_idx] = hit;
54+
55+ // Write optional primitive and instance IDs
56+ if (params.primitive_ids != nullptr ) {
57+ params.primitive_ids [linear_idx] = static_cast <int >(prim_id);
58+ }
59+ if (params.instance_ids != nullptr ) {
60+ params.instance_ids [linear_idx] = static_cast <int >(inst_id);
61+ }
5262}
5363
5464
@@ -58,6 +68,8 @@ extern "C" __global__ void __miss__miss()
5868 optixSetPayload_1 ( float_as_int ( 1 .0f ) );
5969 optixSetPayload_2 ( float_as_int ( 0 .0f ) );
6070 optixSetPayload_3 ( float_as_int ( 0 .0f ) );
71+ optixSetPayload_4 ( static_cast <unsigned int >(-1 ) ); // primitive_id = -1 for miss
72+ optixSetPayload_5 ( static_cast <unsigned int >(-1 ) ); // instance_id = -1 for miss
6173}
6274
6375
@@ -99,4 +111,6 @@ extern "C" __global__ void __closesthit__chit()
99111 optixSetPayload_1 (float_as_int (n.x ));
100112 optixSetPayload_2 (float_as_int (n.y ));
101113 optixSetPayload_3 (float_as_int (n.z ));
114+ optixSetPayload_4 (primIdx); // primitive/triangle index
115+ optixSetPayload_5 (optixGetInstanceId ()); // instance/geometry index
102116}
0 commit comments