1617a3babSopenharmony_ci#version 460 2617a3babSopenharmony_ci#extension GL_NV_ray_tracing : enable 3617a3babSopenharmony_ci#extension GL_EXT_ray_query : enable 4617a3babSopenharmony_ci 5617a3babSopenharmony_cistruct Ray 6617a3babSopenharmony_ci{ 7617a3babSopenharmony_ci vec3 pos; 8617a3babSopenharmony_ci float tmin; 9617a3babSopenharmony_ci vec3 dir; 10617a3babSopenharmony_ci float tmax; 11617a3babSopenharmony_ci}; 12617a3babSopenharmony_ci 13617a3babSopenharmony_cilayout(std430, set = 0, binding = 0) buffer Log 14617a3babSopenharmony_ci{ 15617a3babSopenharmony_ci uint x; 16617a3babSopenharmony_ci uint y; 17617a3babSopenharmony_ci}; 18617a3babSopenharmony_ci 19617a3babSopenharmony_cilayout(binding = 1, set = 0) uniform accelerationStructureEXT rtas; 20617a3babSopenharmony_cilayout(std430, set = 0, binding = 2) buffer Rays { Ray rays[]; }; 21617a3babSopenharmony_ci 22617a3babSopenharmony_civoid doSomething() 23617a3babSopenharmony_ci{ 24617a3babSopenharmony_ci x = 0; 25617a3babSopenharmony_ci y = 0; 26617a3babSopenharmony_ci} 27617a3babSopenharmony_ci 28617a3babSopenharmony_ciRay makeRayDesc() 29617a3babSopenharmony_ci{ 30617a3babSopenharmony_ci Ray ray; 31617a3babSopenharmony_ci ray.pos= vec3(0,0,0); 32617a3babSopenharmony_ci ray.dir = vec3(1,0,0); 33617a3babSopenharmony_ci ray.tmin = 0.0f; 34617a3babSopenharmony_ci ray.tmax = 9999.0; 35617a3babSopenharmony_ci return ray; 36617a3babSopenharmony_ci} 37617a3babSopenharmony_ci 38617a3babSopenharmony_civoid main() 39617a3babSopenharmony_ci{ 40617a3babSopenharmony_ci Ray ray = makeRayDesc(); 41617a3babSopenharmony_ci rayQueryEXT rayQuery; 42617a3babSopenharmony_ci rayQueryInitializeEXT(rayQuery, rtas, gl_RayFlagsNoneEXT, 0xFF, ray.pos, ray.tmin, ray.dir, ray.tmax); 43617a3babSopenharmony_ci 44617a3babSopenharmony_ci mat4x3 _mat4x3; 45617a3babSopenharmony_ci mat3x4 _mat3x4; 46617a3babSopenharmony_ci 47617a3babSopenharmony_ci while (rayQueryProceedEXT(rayQuery)) 48617a3babSopenharmony_ci { 49617a3babSopenharmony_ci uint candidateType = rayQueryGetIntersectionTypeEXT(rayQuery, false); 50617a3babSopenharmony_ci switch(candidateType) 51617a3babSopenharmony_ci { 52617a3babSopenharmony_ci case gl_RayQueryCandidateIntersectionTriangleEXT: 53617a3babSopenharmony_ci 54617a3babSopenharmony_ci rayQueryTerminateEXT(rayQuery); 55617a3babSopenharmony_ci _mat4x3 = rayQueryGetIntersectionObjectToWorldEXT(rayQuery, false); 56617a3babSopenharmony_ci _mat3x4 = transpose(_mat4x3); 57617a3babSopenharmony_ci rayQueryConfirmIntersectionEXT(rayQuery); 58617a3babSopenharmony_ci 59617a3babSopenharmony_ci if (rayQueryGetIntersectionFrontFaceEXT(rayQuery, true)) 60617a3babSopenharmony_ci { 61617a3babSopenharmony_ci doSomething(); 62617a3babSopenharmony_ci } 63617a3babSopenharmony_ci 64617a3babSopenharmony_ci if (rayQueryGetIntersectionBarycentricsEXT(rayQuery, true).x == 0) 65617a3babSopenharmony_ci { 66617a3babSopenharmony_ci doSomething(); 67617a3babSopenharmony_ci } 68617a3babSopenharmony_ci 69617a3babSopenharmony_ci if (rayQueryGetIntersectionInstanceCustomIndexEXT(rayQuery, true) > 0) 70617a3babSopenharmony_ci { 71617a3babSopenharmony_ci doSomething(); 72617a3babSopenharmony_ci } 73617a3babSopenharmony_ci 74617a3babSopenharmony_ci if (rayQueryGetIntersectionInstanceIdEXT(rayQuery, true) > 0) 75617a3babSopenharmony_ci { 76617a3babSopenharmony_ci doSomething(); 77617a3babSopenharmony_ci } 78617a3babSopenharmony_ci 79617a3babSopenharmony_ci if (rayQueryGetIntersectionObjectRayDirectionEXT(rayQuery, true).x > 0) 80617a3babSopenharmony_ci { 81617a3babSopenharmony_ci doSomething(); 82617a3babSopenharmony_ci } 83617a3babSopenharmony_ci 84617a3babSopenharmony_ci if (rayQueryGetIntersectionObjectRayOriginEXT(rayQuery, true).x > 0) 85617a3babSopenharmony_ci { 86617a3babSopenharmony_ci doSomething(); 87617a3babSopenharmony_ci } 88617a3babSopenharmony_ci 89617a3babSopenharmony_ci if (rayQueryGetIntersectionPrimitiveIndexEXT(rayQuery, true) > 0) 90617a3babSopenharmony_ci { 91617a3babSopenharmony_ci doSomething(); 92617a3babSopenharmony_ci } 93617a3babSopenharmony_ci 94617a3babSopenharmony_ci if (rayQueryGetIntersectionTEXT(rayQuery, true) > 0.f) 95617a3babSopenharmony_ci { 96617a3babSopenharmony_ci doSomething(); 97617a3babSopenharmony_ci } 98617a3babSopenharmony_ci 99617a3babSopenharmony_ci if (rayQueryGetIntersectionInstanceShaderBindingTableRecordOffsetEXT(rayQuery, true) > 0) 100617a3babSopenharmony_ci { 101617a3babSopenharmony_ci doSomething(); 102617a3babSopenharmony_ci } 103617a3babSopenharmony_ci break; 104617a3babSopenharmony_ci 105617a3babSopenharmony_ci case gl_RayQueryCandidateIntersectionAABBEXT: 106617a3babSopenharmony_ci { 107617a3babSopenharmony_ci _mat4x3 = rayQueryGetIntersectionObjectToWorldEXT(rayQuery, false); 108617a3babSopenharmony_ci _mat3x4 = transpose(_mat4x3); 109617a3babSopenharmony_ci if (rayQueryGetIntersectionCandidateAABBOpaqueEXT(rayQuery)) 110617a3babSopenharmony_ci { 111617a3babSopenharmony_ci doSomething(); 112617a3babSopenharmony_ci } 113617a3babSopenharmony_ci 114617a3babSopenharmony_ci float t = 0.5; 115617a3babSopenharmony_ci rayQueryGenerateIntersectionEXT(rayQuery, t); 116617a3babSopenharmony_ci rayQueryTerminateEXT(rayQuery); 117617a3babSopenharmony_ci break; 118617a3babSopenharmony_ci } 119617a3babSopenharmony_ci } 120617a3babSopenharmony_ci } 121617a3babSopenharmony_ci 122617a3babSopenharmony_ci if(_mat3x4[0][0] == _mat4x3[0][0]) 123617a3babSopenharmony_ci { 124617a3babSopenharmony_ci doSomething(); 125617a3babSopenharmony_ci } 126617a3babSopenharmony_ci 127617a3babSopenharmony_ci uint committedStatus = rayQueryGetIntersectionTypeEXT(rayQuery, true); 128617a3babSopenharmony_ci 129617a3babSopenharmony_ci switch(committedStatus) 130617a3babSopenharmony_ci { 131617a3babSopenharmony_ci case gl_RayQueryCommittedIntersectionNoneEXT : 132617a3babSopenharmony_ci _mat4x3 = rayQueryGetIntersectionWorldToObjectEXT(rayQuery, false); 133617a3babSopenharmony_ci _mat3x4 = transpose(_mat4x3); 134617a3babSopenharmony_ci break; 135617a3babSopenharmony_ci 136617a3babSopenharmony_ci case gl_RayQueryCommittedIntersectionTriangleEXT : 137617a3babSopenharmony_ci _mat4x3 = rayQueryGetIntersectionWorldToObjectEXT(rayQuery, true); 138617a3babSopenharmony_ci _mat3x4 = transpose(_mat4x3); 139617a3babSopenharmony_ci 140617a3babSopenharmony_ci if (rayQueryGetIntersectionFrontFaceEXT(rayQuery, true)) 141617a3babSopenharmony_ci { 142617a3babSopenharmony_ci doSomething(); 143617a3babSopenharmony_ci } 144617a3babSopenharmony_ci 145617a3babSopenharmony_ci if (rayQueryGetIntersectionBarycentricsEXT(rayQuery, true).y == 0) 146617a3babSopenharmony_ci { 147617a3babSopenharmony_ci doSomething(); 148617a3babSopenharmony_ci } 149617a3babSopenharmony_ci break; 150617a3babSopenharmony_ci 151617a3babSopenharmony_ci case gl_RayQueryCommittedIntersectionGeneratedEXT : 152617a3babSopenharmony_ci 153617a3babSopenharmony_ci if(rayQueryGetIntersectionGeometryIndexEXT(rayQuery, true) > 0) 154617a3babSopenharmony_ci { 155617a3babSopenharmony_ci doSomething(); 156617a3babSopenharmony_ci } 157617a3babSopenharmony_ci 158617a3babSopenharmony_ci if(rayQueryGetIntersectionInstanceIdEXT(rayQuery, true) > 0) 159617a3babSopenharmony_ci { 160617a3babSopenharmony_ci doSomething(); 161617a3babSopenharmony_ci } 162617a3babSopenharmony_ci 163617a3babSopenharmony_ci if(rayQueryGetIntersectionInstanceCustomIndexEXT(rayQuery, true) > 0) 164617a3babSopenharmony_ci { 165617a3babSopenharmony_ci doSomething(); 166617a3babSopenharmony_ci } 167617a3babSopenharmony_ci 168617a3babSopenharmony_ci if(rayQueryGetIntersectionObjectRayDirectionEXT(rayQuery, true).z > 0) 169617a3babSopenharmony_ci { 170617a3babSopenharmony_ci doSomething(); 171617a3babSopenharmony_ci } 172617a3babSopenharmony_ci 173617a3babSopenharmony_ci if(rayQueryGetIntersectionObjectRayOriginEXT(rayQuery, true).x > 0) 174617a3babSopenharmony_ci { 175617a3babSopenharmony_ci doSomething(); 176617a3babSopenharmony_ci } 177617a3babSopenharmony_ci 178617a3babSopenharmony_ci if(rayQueryGetIntersectionPrimitiveIndexEXT(rayQuery, true) > 0) 179617a3babSopenharmony_ci { 180617a3babSopenharmony_ci doSomething(); 181617a3babSopenharmony_ci } 182617a3babSopenharmony_ci 183617a3babSopenharmony_ci if(rayQueryGetIntersectionTEXT(rayQuery, true) > 0.f) 184617a3babSopenharmony_ci { 185617a3babSopenharmony_ci doSomething(); 186617a3babSopenharmony_ci } 187617a3babSopenharmony_ci break; 188617a3babSopenharmony_ci } 189617a3babSopenharmony_ci 190617a3babSopenharmony_ci if (_mat3x4[0][0] == _mat4x3[0][0]) 191617a3babSopenharmony_ci { 192617a3babSopenharmony_ci doSomething(); 193617a3babSopenharmony_ci } 194617a3babSopenharmony_ci 195617a3babSopenharmony_ci if (rayQueryGetRayFlagsEXT(rayQuery) > 0) 196617a3babSopenharmony_ci { 197617a3babSopenharmony_ci doSomething(); 198617a3babSopenharmony_ci } 199617a3babSopenharmony_ci 200617a3babSopenharmony_ci if (rayQueryGetRayTMinEXT(rayQuery) > 0.0) 201617a3babSopenharmony_ci { 202617a3babSopenharmony_ci doSomething(); 203617a3babSopenharmony_ci } 204617a3babSopenharmony_ci 205617a3babSopenharmony_ci vec3 o = rayQueryGetWorldRayOriginEXT(rayQuery); 206617a3babSopenharmony_ci vec3 d = rayQueryGetWorldRayDirectionEXT(rayQuery); 207617a3babSopenharmony_ci 208617a3babSopenharmony_ci if (o.x == d.z) 209617a3babSopenharmony_ci { 210617a3babSopenharmony_ci doSomething(); 211617a3babSopenharmony_ci } 212617a3babSopenharmony_ci} 213