1#version 460 2#extension GL_NV_ray_tracing : enable 3#extension GL_EXT_ray_query : enable 4 5struct Ray 6{ 7 vec3 pos; 8 float tmin; 9 vec3 dir; 10 float tmax; 11}; 12 13layout(std430, set = 0, binding = 0) buffer Log 14{ 15 uint x; 16 uint y; 17}; 18 19layout(binding = 1, set = 0) uniform accelerationStructureEXT rtas; 20layout(std430, set = 0, binding = 2) buffer Rays { Ray rays[]; }; 21 22void doSomething() 23{ 24 x = 0; 25 y = 0; 26} 27 28uint launchIndex() 29{ 30 return gl_LaunchIDNV.z*gl_LaunchSizeNV.x*gl_LaunchSizeNV.y + gl_LaunchIDNV.y*gl_LaunchSizeNV.x + gl_LaunchIDNV.x; 31} 32 33void main() 34{ 35 uint index = launchIndex(); 36 Ray ray = rays[index]; 37 rayQueryEXT rayQuery; 38 39 bool committed_true = true; 40 bool committed_false = false; 41 42 rayQueryInitializeEXT(rayQuery, rtas, gl_RayFlagsOpaqueEXT, gl_RayFlagsCullBackFacingTrianglesEXT, ray.pos, ray.tmin, ray.dir, ray.tmax); 43 while (rayQueryProceedEXT(rayQuery)) 44 { 45 mat4x3 mat_o2w; 46 mat4x3 mat_w2o; 47 48 uint candidateType = rayQueryGetIntersectionTypeEXT(rayQuery, committed_false); 49 if (candidateType == gl_RayQueryCandidateIntersectionTriangleEXT) 50 { 51 rayQueryTerminateEXT(rayQuery); 52 53 mat_o2w = rayQueryGetIntersectionObjectToWorldEXT(rayQuery, committed_false); 54 mat_w2o = rayQueryGetIntersectionWorldToObjectEXT(rayQuery, committed_false); 55 56 rayQueryConfirmIntersectionEXT(rayQuery); 57 58 if (rayQueryGetIntersectionFrontFaceEXT(rayQuery, committed_true)) 59 { 60 doSomething(); 61 } 62 if (rayQueryGetIntersectionBarycentricsEXT(rayQuery, committed_true).x == 0) 63 { 64 doSomething(); 65 } 66 if (rayQueryGetIntersectionInstanceCustomIndexEXT(rayQuery, committed_true) > 0) 67 { 68 doSomething(); 69 } 70 if (rayQueryGetIntersectionInstanceIdEXT(rayQuery, committed_true) > 0) 71 { 72 doSomething(); 73 } 74 if (rayQueryGetIntersectionObjectRayDirectionEXT(rayQuery, committed_true).x > 0) 75 { 76 doSomething(); 77 } 78 if (rayQueryGetIntersectionObjectRayOriginEXT(rayQuery, committed_true).x > 0) 79 { 80 doSomething(); 81 } 82 if (rayQueryGetIntersectionPrimitiveIndexEXT(rayQuery, committed_true) > 0) 83 { 84 doSomething(); 85 } 86 if (rayQueryGetIntersectionTEXT(rayQuery, committed_true) > 0.f) 87 { 88 doSomething(); 89 } 90 if (rayQueryGetIntersectionInstanceShaderBindingTableRecordOffsetEXT(rayQuery, committed_true) > 0) 91 { 92 doSomething(); 93 } 94 } 95 } 96 97 uint committedStatus = rayQueryGetIntersectionTypeEXT(rayQuery, committed_true); 98 if (committedStatus == gl_RayQueryCommittedIntersectionGeneratedEXT) 99 { 100 if (rayQueryGetIntersectionGeometryIndexEXT(rayQuery, committed_true) > 0) 101 { 102 doSomething(); 103 } 104 } 105} 106