1#version 460 2#extension GL_EXT_ray_query : enable 3#extension GL_EXT_ray_flags_primitive_culling : enable 4#extension GL_EXT_ray_tracing_position_fetch : enable 5 6layout(primitive_culling); 7struct Ray 8{ 9 vec3 pos; 10 float tmin; 11 vec3 dir; 12 float tmax; 13}; 14 15layout(std430, set = 0, binding = 0) buffer Log 16{ 17 uint x; 18 uint y; 19}; 20 21layout(binding = 1, set = 0) uniform accelerationStructureEXT rtas; 22layout(std430, set = 0, binding = 2) buffer Rays { Ray rays[]; }; 23 24void doSomething() 25{ 26 x = 0; 27 y = 0; 28} 29 30Ray makeRayDesc() 31{ 32 Ray ray; 33 ray.pos= vec3(0,0,0); 34 ray.dir = vec3(1,0,0); 35 ray.tmin = 0.0f; 36 ray.tmax = 9999.0; 37 return ray; 38} 39 40void main() 41{ 42 Ray ray = makeRayDesc(); 43 rayQueryEXT rayQuery; 44 rayQueryInitializeEXT(rayQuery, rtas, gl_RayFlagsNoneEXT, 0xFF, ray.pos, ray.tmin, ray.dir, ray.tmax); 45 46 mat4x3 _mat4x3; 47 mat3x4 _mat3x4; 48 49 while (rayQueryProceedEXT(rayQuery)) 50 { 51 uint candidateType = rayQueryGetIntersectionTypeEXT(rayQuery, false); 52 switch(candidateType) 53 { 54 case gl_RayQueryCandidateIntersectionTriangleEXT: 55 56 rayQueryTerminateEXT(rayQuery); 57 _mat4x3 = rayQueryGetIntersectionObjectToWorldEXT(rayQuery, false); 58 _mat3x4 = transpose(_mat4x3); 59 rayQueryConfirmIntersectionEXT(rayQuery); 60 61 if (rayQueryGetIntersectionFrontFaceEXT(rayQuery, true)) 62 { 63 doSomething(); 64 } 65 66 if (rayQueryGetIntersectionBarycentricsEXT(rayQuery, true).x == 0) 67 { 68 doSomething(); 69 } 70 71 if (rayQueryGetIntersectionInstanceCustomIndexEXT(rayQuery, true) > 0) 72 { 73 doSomething(); 74 } 75 76 if (rayQueryGetIntersectionInstanceIdEXT(rayQuery, true) > 0) 77 { 78 doSomething(); 79 } 80 81 if (rayQueryGetIntersectionObjectRayDirectionEXT(rayQuery, true).x > 0) 82 { 83 doSomething(); 84 } 85 86 if (rayQueryGetIntersectionObjectRayOriginEXT(rayQuery, true).x > 0) 87 { 88 doSomething(); 89 } 90 91 if (rayQueryGetIntersectionPrimitiveIndexEXT(rayQuery, true) > 0) 92 { 93 doSomething(); 94 } 95 96 if (rayQueryGetIntersectionTEXT(rayQuery, true) > 0.f) 97 { 98 doSomething(); 99 } 100 101 if (rayQueryGetIntersectionInstanceShaderBindingTableRecordOffsetEXT(rayQuery, true) > 0) 102 { 103 doSomething(); 104 } 105 break; 106 107 case gl_RayQueryCandidateIntersectionAABBEXT: 108 { 109 _mat4x3 = rayQueryGetIntersectionObjectToWorldEXT(rayQuery, false); 110 _mat3x4 = transpose(_mat4x3); 111 if (rayQueryGetIntersectionCandidateAABBOpaqueEXT(rayQuery)) 112 { 113 doSomething(); 114 } 115 116 float t = 0.5; 117 rayQueryGenerateIntersectionEXT(rayQuery, t); 118 rayQueryTerminateEXT(rayQuery); 119 break; 120 } 121 } 122 } 123 124 if(_mat3x4[0][0] == _mat4x3[0][0]) 125 { 126 doSomething(); 127 } 128 129 uint committedStatus = rayQueryGetIntersectionTypeEXT(rayQuery, true); 130 131 switch(committedStatus) 132 { 133 case gl_RayQueryCommittedIntersectionNoneEXT : 134 _mat4x3 = rayQueryGetIntersectionWorldToObjectEXT(rayQuery, false); 135 _mat3x4 = transpose(_mat4x3); 136 break; 137 138 case gl_RayQueryCommittedIntersectionTriangleEXT : 139 _mat4x3 = rayQueryGetIntersectionWorldToObjectEXT(rayQuery, true); 140 _mat3x4 = transpose(_mat4x3); 141 142 if (rayQueryGetIntersectionFrontFaceEXT(rayQuery, true)) 143 { 144 doSomething(); 145 } 146 147 if (rayQueryGetIntersectionBarycentricsEXT(rayQuery, true).y == 0) 148 { 149 doSomething(); 150 } 151 { 152 vec3 positions[3]; 153 rayQueryGetIntersectionTriangleVertexPositionsEXT(rayQuery, true, positions); 154 if (positions[0].x < 0 && positions[2].y > 0) 155 { 156 doSomething(); 157 } 158 } 159 break; 160 161 case gl_RayQueryCommittedIntersectionGeneratedEXT : 162 163 if(rayQueryGetIntersectionGeometryIndexEXT(rayQuery, true) > 0) 164 { 165 doSomething(); 166 } 167 168 if(rayQueryGetIntersectionInstanceIdEXT(rayQuery, true) > 0) 169 { 170 doSomething(); 171 } 172 173 if(rayQueryGetIntersectionInstanceCustomIndexEXT(rayQuery, true) > 0) 174 { 175 doSomething(); 176 } 177 178 if(rayQueryGetIntersectionObjectRayDirectionEXT(rayQuery, true).z > 0) 179 { 180 doSomething(); 181 } 182 183 if(rayQueryGetIntersectionObjectRayOriginEXT(rayQuery, true).x > 0) 184 { 185 doSomething(); 186 } 187 188 if(rayQueryGetIntersectionPrimitiveIndexEXT(rayQuery, true) > 0) 189 { 190 doSomething(); 191 } 192 193 if(rayQueryGetIntersectionTEXT(rayQuery, true) > 0.f) 194 { 195 doSomething(); 196 } 197 break; 198 } 199 200 if (_mat3x4[0][0] == _mat4x3[0][0]) 201 { 202 doSomething(); 203 } 204 205 if (rayQueryGetRayFlagsEXT(rayQuery) > gl_RayFlagsSkipTrianglesEXT) 206 { 207 doSomething(); 208 } 209 210 if (rayQueryGetRayTMinEXT(rayQuery) > 0.0) 211 { 212 doSomething(); 213 } 214 215 vec3 o = rayQueryGetWorldRayOriginEXT(rayQuery); 216 vec3 d = rayQueryGetWorldRayDirectionEXT(rayQuery); 217 218 if (o.x == d.z) 219 { 220 doSomething(); 221 } 222} 223