1#version 460
2#extension GL_EXT_ray_query : require
3
4layout(local_size_x = 16, local_size_y = 8, local_size_z = 1) in;
5
6layout(binding = 0, set = 0) uniform accelerationStructureEXT tlas;
7
8void main()
9{
10  rayQueryEXT rayQuery;
11  rayQueryInitializeEXT(rayQuery,       // Ray query
12                        tlas,           // Top-level acceleration structure
13                        0,              // Ray flags
14                        0xFF,           // 8-bit instance mask
15                        vec3(0),        // Ray origin
16                        0.0,            // Minimum t-value
17                        vec3(1, 0, 0),  // Ray direction
18                        10000.0);       // Maximum t-value
19
20  // yes this is silly, just want to verify the return types
21  bool rq_proceed = rayQueryProceedEXT(rayQuery);
22  while(rq_proceed)
23  {
24    rq_proceed = rayQueryProceedEXT(rayQuery);
25  }
26
27  const uint intersectionType = rayQueryGetIntersectionTypeEXT(rayQuery, true);
28  const float rayTMin = rayQueryGetRayTMinEXT(rayQuery);
29  const uint rayFlags = rayQueryGetRayFlagsEXT(rayQuery);
30  const vec3 worldRayOrigin = rayQueryGetWorldRayOriginEXT(rayQuery);
31  const vec3 worldDirection = rayQueryGetWorldRayDirectionEXT(rayQuery);
32  const float intersectionT = rayQueryGetIntersectionTEXT(rayQuery, true);
33  const int customIndex = rayQueryGetIntersectionInstanceCustomIndexEXT(rayQuery, true);
34  const int instanceId = rayQueryGetIntersectionInstanceIdEXT(rayQuery, true);
35  const uint sbtOffset = rayQueryGetIntersectionInstanceShaderBindingTableRecordOffsetEXT(rayQuery, true);
36  const int geometryIndex = rayQueryGetIntersectionGeometryIndexEXT(rayQuery, true);
37  const int primitiveIndex = rayQueryGetIntersectionPrimitiveIndexEXT(rayQuery, true);
38  const vec2 barys = rayQueryGetIntersectionBarycentricsEXT(rayQuery, true);
39  const bool frontface = rayQueryGetIntersectionFrontFaceEXT(rayQuery, true);
40  const bool aabbOpaque = rayQueryGetIntersectionCandidateAABBOpaqueEXT(rayQuery);
41  const vec3 objRayDirection = rayQueryGetIntersectionObjectRayDirectionEXT(rayQuery, true);
42  const vec3 objRayOrigin = rayQueryGetIntersectionObjectRayOriginEXT(rayQuery, true);
43  const mat4x3 objToWorld = rayQueryGetIntersectionObjectToWorldEXT(rayQuery, true);
44  const mat4x3 worldToObj = rayQueryGetIntersectionWorldToObjectEXT(rayQuery, true);
45}
46