| #version 460 |
| #extension GL_NV_ray_tracing : enable |
| #extension GL_EXT_ray_query : enable |
| |
| struct Ray |
| { |
| vec3 pos; |
| float tmin; |
| vec3 dir; |
| float tmax; |
| }; |
| |
| layout(binding = 0, set = 0) uniform accelerationStructureEXT rtas; |
| layout(std430, set = 0, binding = 2) buffer Rays { Ray rays[]; }; |
| layout(shaderRecordNV) buffer block |
| { |
| uint idx; |
| }; |
| |
| uint launchIndex() |
| { |
| return gl_LaunchIDNV.z*gl_LaunchSizeNV.x*gl_LaunchSizeNV.y + gl_LaunchIDNV.y*gl_LaunchSizeNV.x + gl_LaunchIDNV.x; |
| } |
| |
| rayQueryEXT g_rayQueryArray[4]; |
| rayQueryEXT g_rayQueryUnused; |
| |
| void main() |
| { |
| uint index = launchIndex(); |
| Ray ray = rays[index]; |
| |
| rayQueryEXT rayQuery0a; |
| rayQueryEXT rayQuery0b; |
| |
| g_rayQueryArray[idx] = rayQuery0b; // Stored here, then overwritten with rayQuery0a |
| g_rayQueryArray[idx] = rayQuery0a; |
| |
| // No separate allocation, just a handle copy |
| // optimizations should have eliminated load from global array |
| rayQueryEXT rayQuery0c = g_rayQueryArray[idx]; |
| |
| // rayQuery0a is the one actually used here |
| rayQueryInitializeEXT(rayQuery0c, rtas, gl_RayFlagsOpaqueEXT, gl_RayFlagsCullBackFacingTrianglesEXT, ray.pos, ray.tmin, ray.dir, ray.tmax); |
| |
| // AllocateRayQuery occurs here, rather than next to allocas |
| // Should not be extray allocate, since above should allocate and copy |
| rayQueryEXT rayQuery1c; |
| // update the rayFlags as RAY_FLAG_FORCE_OPAQUE |
| rayQueryInitializeEXT(rayQuery1c, rtas, gl_RayFlagsOpaqueEXT, gl_RayFlagsCullFrontFacingTrianglesEXT, ray.pos, ray.tmin, ray.dir, ray.tmax); |
| |
| rayQueryInitializeEXT(rayQuery1c, rtas, gl_RayFlagsOpaqueEXT|gl_RayFlagsNoOpaqueEXT, gl_RayFlagsCullOpaqueEXT, ray.pos, ray.tmin, ray.dir, ray.tmax); |
| } |