Intel® Embree Ray Tracing Kernels
Discussion forum on the open source ray tracing kernels for fast photo-realistic rendering on Intel® CPU(s)

user geometry intersection routine

AndrewC
New Contributor III
587 Views

Following from the "user_geometry" example. I am mixing analytical spheres and triangulated geometry.

The sphere intersection function has a signature of void sphereIntersectFunc(void* spheres_i, RTCRay& ray, size_t item);

My algorithm simply sets up the rays, loops over them and calls

                rtcIntersect(rtcscene, rtc_ray);

In the "user defined intersection" function for the sphere(s). I notice in the passed RTCRay structure  two things that I find a bit confusing.

- the tnear and tfar values are not 0.0 and inf as I would expect. They are often a "segment" of the ray. I can understand this may be an optimization based on a geometry space subdivision. It appears I should restrict any intersection to only be within the passed tnear and tfar.

- the RTCRay structure sometimes also contains a geomID  == the triangulated geometry ID. That is, the ray seems to already have intersected some part of the triangulated geometry before being passed to the "sphere" intersection routine. I really don't understand this.  I would expect that once a ray has intersected a geometry, it would return immediately from rtcIntersect.

 

0 Kudos
1 Solution
SvenW_Intel
Moderator
587 Views

1) In the user geometry callback the tnear value will always be identical to the tnear initially passed to the ray, but the tfar value will shrink when hits get found. Reason is that rtcIntersect is interested in the closest hit only, and the current closest distance is recorded as ray.tfar.

2) rtcIntersect returns the closest intersection, thus even if it already found an intersection with a triangle, intersections with your sphere might still be closer than this current closest hit. This is why you see triangle hit data inside the ray. However, you should never read that hit data, your callback should just update the hit data (and tfar) when a closer hit is found.

 

 

View solution in original post

0 Kudos
2 Replies
SvenW_Intel
Moderator
588 Views

1) In the user geometry callback the tnear value will always be identical to the tnear initially passed to the ray, but the tfar value will shrink when hits get found. Reason is that rtcIntersect is interested in the closest hit only, and the current closest distance is recorded as ray.tfar.

2) rtcIntersect returns the closest intersection, thus even if it already found an intersection with a triangle, intersections with your sphere might still be closer than this current closest hit. This is why you see triangle hit data inside the ray. However, you should never read that hit data, your callback should just update the hit data (and tfar) when a closer hit is found.

 

 

0 Kudos
AndrewC
New Contributor III
587 Views

OK , thanks for clarifying!

0 Kudos
Reply