I’m trying to add spheres to my patch tracer but I’m having trouble with not getting any intersections when I call optixTrace(…).
Currently I have a TLAS with 1 triangle BLAS and 1 sphere BLAS. The TLAS looks correct when viewed in the Nsight Compute AS viewer. I am getting triangle intersections, but no sphere intersections.
These were the steps I tried:
- Create a program group with the
moduleIS set to the built-in sphere intersection module retrieved from
builtin_is_options.builtinISModuleType = OPTIX_PRIMITIVE_TYPE_SPHERE;.
- Add an SBT record for every sphere with the correct program group header.
I’m starting to get a bit clueless now. Do I need separate closesthit programs for triangles/spheres ?
Thanks in advance.
OPTIX_PRIMITIVE_TYPE_FLAGS_TRIANGLE | OPTIX_PRIMITIVE_TYPE_FLAGS_SPHERE, intersection program, and SBT setup sound correct.
Do I need separate closesthit programs for triangles/spheres?
Not necessarily, but the intersection attributes for triangles (two barycentric coordinates beta and gamma) and for spheres (one for the second intersection distance ordered along a ray) are different.
When sharing hit programs among different geometric primitive types, you must be able to distinguish the hit primitve types, and that’s done via
optixGetHitKind resp. the convenience functions on top of that, like
That is used to access and calculate the resp. vertex/shading attributes accordingly per primitive type.
Though if you’re just using the intersection distance
optixGetRayTmax, that’s working for any primitive.
If you implement different hit programs for triangles and spheres, you just need to use the right ones on the resp. SBT entries.
Note that when using multiple ray types (radiance, shadow) all ray types must have the SBT hit records with the sphere intersection program set correctly.
Sounds like an issue with the SBT offset.
Make sure that the two
OptixInstance structures inside your TLAS have their
sbtOffset set to 0 and 1 to get the correct effective SBT entry.
See the formula in https://raytracing-docs.nvidia.com/optix8/guide/index.html#shader_binding_table#accelstruct-sbt
Thank you ! It was indeed the SBT.
I assume you meant to set the
sbtOffset to 0 and the amount of records for the previous instance, like in the docs (example-sbt-for-a-scene) ?
I was assuming you had only one SBT record per GAS.
Yes, the instance sbtOffset of the first instance is usually 0 and then the following instance sbtOffsets have the sum of all previous numbers of SBT records per GAS. (That’s the line with
SBT instance offset: 0 ... 6 ... in that table.)