| #version 460 |
| #extension GL_EXT_ray_query : enable |
| #extension GL_EXT_ray_flags_primitive_culling : enable |
| |
| layout(primitive_culling); |
| struct Ray |
| { |
| vec3 pos; |
| float tmin; |
| vec3 dir; |
| float tmax; |
| }; |
| |
| layout(std430, set = 0, binding = 0) buffer Log |
| { |
| uint x; |
| uint y; |
| }; |
| |
| layout(binding = 1, set = 0) uniform accelerationStructureEXT rtas; |
| layout(std430, set = 0, binding = 2) buffer Rays { Ray rays[]; }; |
| |
| void doSomething() |
| { |
| x = 0; |
| y = 0; |
| } |
| |
| Ray makeRayDesc() |
| { |
| Ray ray; |
| ray.pos= vec3(0,0,0); |
| ray.dir = vec3(1,0,0); |
| ray.tmin = 0.0f; |
| ray.tmax = 9999.0; |
| return ray; |
| } |
| |
| void main() |
| { |
| Ray ray = makeRayDesc(); |
| rayQueryEXT rayQuery; |
| rayQueryInitializeEXT(rayQuery, rtas, gl_RayFlagsNoneEXT, 0xFF, ray.pos, ray.tmin, ray.dir, ray.tmax); |
| |
| mat4x3 _mat4x3; |
| mat3x4 _mat3x4; |
| |
| while (rayQueryProceedEXT(rayQuery)) |
| { |
| uint candidateType = rayQueryGetIntersectionTypeEXT(rayQuery, false); |
| switch(candidateType) |
| { |
| case gl_RayQueryCandidateIntersectionTriangleEXT: |
| |
| rayQueryTerminateEXT(rayQuery); |
| _mat4x3 = rayQueryGetIntersectionObjectToWorldEXT(rayQuery, false); |
| _mat3x4 = transpose(_mat4x3); |
| rayQueryConfirmIntersectionEXT(rayQuery); |
| |
| if (rayQueryGetIntersectionFrontFaceEXT(rayQuery, true)) |
| { |
| doSomething(); |
| } |
| |
| if (rayQueryGetIntersectionBarycentricsEXT(rayQuery, true).x == 0) |
| { |
| doSomething(); |
| } |
| |
| if (rayQueryGetIntersectionInstanceCustomIndexEXT(rayQuery, true) > 0) |
| { |
| doSomething(); |
| } |
| |
| if (rayQueryGetIntersectionInstanceIdEXT(rayQuery, true) > 0) |
| { |
| doSomething(); |
| } |
| |
| if (rayQueryGetIntersectionObjectRayDirectionEXT(rayQuery, true).x > 0) |
| { |
| doSomething(); |
| } |
| |
| if (rayQueryGetIntersectionObjectRayOriginEXT(rayQuery, true).x > 0) |
| { |
| doSomething(); |
| } |
| |
| if (rayQueryGetIntersectionPrimitiveIndexEXT(rayQuery, true) > 0) |
| { |
| doSomething(); |
| } |
| |
| if (rayQueryGetIntersectionTEXT(rayQuery, true) > 0.f) |
| { |
| doSomething(); |
| } |
| |
| if (rayQueryGetIntersectionInstanceShaderBindingTableRecordOffsetEXT(rayQuery, true) > 0) |
| { |
| doSomething(); |
| } |
| break; |
| |
| case gl_RayQueryCandidateIntersectionAABBEXT: |
| { |
| _mat4x3 = rayQueryGetIntersectionObjectToWorldEXT(rayQuery, false); |
| _mat3x4 = transpose(_mat4x3); |
| if (rayQueryGetIntersectionCandidateAABBOpaqueEXT(rayQuery)) |
| { |
| doSomething(); |
| } |
| |
| float t = 0.5; |
| rayQueryGenerateIntersectionEXT(rayQuery, t); |
| rayQueryTerminateEXT(rayQuery); |
| break; |
| } |
| } |
| } |
| |
| if(_mat3x4[0][0] == _mat4x3[0][0]) |
| { |
| doSomething(); |
| } |
| |
| uint committedStatus = rayQueryGetIntersectionTypeEXT(rayQuery, true); |
| |
| switch(committedStatus) |
| { |
| case gl_RayQueryCommittedIntersectionNoneEXT : |
| _mat4x3 = rayQueryGetIntersectionWorldToObjectEXT(rayQuery, false); |
| _mat3x4 = transpose(_mat4x3); |
| break; |
| |
| case gl_RayQueryCommittedIntersectionTriangleEXT : |
| _mat4x3 = rayQueryGetIntersectionWorldToObjectEXT(rayQuery, true); |
| _mat3x4 = transpose(_mat4x3); |
| |
| if (rayQueryGetIntersectionFrontFaceEXT(rayQuery, true)) |
| { |
| doSomething(); |
| } |
| |
| if (rayQueryGetIntersectionBarycentricsEXT(rayQuery, true).y == 0) |
| { |
| doSomething(); |
| } |
| break; |
| |
| case gl_RayQueryCommittedIntersectionGeneratedEXT : |
| |
| if(rayQueryGetIntersectionGeometryIndexEXT(rayQuery, true) > 0) |
| { |
| doSomething(); |
| } |
| |
| if(rayQueryGetIntersectionInstanceIdEXT(rayQuery, true) > 0) |
| { |
| doSomething(); |
| } |
| |
| if(rayQueryGetIntersectionInstanceCustomIndexEXT(rayQuery, true) > 0) |
| { |
| doSomething(); |
| } |
| |
| if(rayQueryGetIntersectionObjectRayDirectionEXT(rayQuery, true).z > 0) |
| { |
| doSomething(); |
| } |
| |
| if(rayQueryGetIntersectionObjectRayOriginEXT(rayQuery, true).x > 0) |
| { |
| doSomething(); |
| } |
| |
| if(rayQueryGetIntersectionPrimitiveIndexEXT(rayQuery, true) > 0) |
| { |
| doSomething(); |
| } |
| |
| if(rayQueryGetIntersectionTEXT(rayQuery, true) > 0.f) |
| { |
| doSomething(); |
| } |
| break; |
| } |
| |
| if (_mat3x4[0][0] == _mat4x3[0][0]) |
| { |
| doSomething(); |
| } |
| |
| if (rayQueryGetRayFlagsEXT(rayQuery) > gl_RayFlagsSkipTrianglesEXT) |
| { |
| doSomething(); |
| } |
| |
| if (rayQueryGetRayTMinEXT(rayQuery) > 0.0) |
| { |
| doSomething(); |
| } |
| |
| vec3 o = rayQueryGetWorldRayOriginEXT(rayQuery); |
| vec3 d = rayQueryGetWorldRayDirectionEXT(rayQuery); |
| |
| if (o.x == d.z) |
| { |
| doSomething(); |
| } |
| } |