yum-mirror/slang
Making it easier to work with shaders
git clone https://git.yummers.dev/yum-mirror/slang
f02b08490
master
1// hit-object-trace-ray.slang 2 3//TEST:SIMPLE: -target dxil -entry rayGenerationMain -stage raygeneration -profile sm_6_5 -DNV_SHADER_EXTN_SLOT=u0 4//TEST:SIMPLE(filecheck=SPIRV): -target spirv -entry rayGenerationMain -stage raygeneration -profile sm_6_5 -line-directive-mode none 5//TEST:SIMPLE(filecheck=SPIRV): -target spirv -entry rayGenerationMain -stage raygeneration -emit-spirv-directly 6 7//TEST:SIMPLE(filecheck=CHECK): -target cuda -entry rayGenerationMain -stage raygeneration 8 9//DISABLE_TEST(compute):COMPARE_COMPUTE:-d3d12 -output-using-type -profile sm_6_6 -render-feature ray-query 10//DISABLE_TEST(compute):COMPARE_COMPUTE:-vk -output-using-type -render-feature ray-query 11 12//TEST_INPUT: set scene = AccelerationStructure 13uniform RaytracingAccelerationStructure scene; 14 15//TEST_INPUT:set outputBuffer = out ubuffer(data=[0, 0, 0, 0], stride=4) 16RWStructuredBuffer<uint> outputBuffer; 17 18struct SomeValues 19{ 20 int a; 21 float b; 22}; 23 24uint calcValue(HitObject hit) 25{ 26 uint r = 0; 27 28 if (hit.IsHit()) 29 { 30 uint instanceIndex = hit.GetInstanceIndex(); 31 uint instanceID = hit.GetInstanceID(); 32 uint geometryIndex = hit.GetGeometryIndex(); 33 uint primitiveIndex = hit.GetPrimitiveIndex(); 34 int clusterID = hit.GetClusterID(); 35 float4 posRadius = hit.GetSpherePositionAndRadius(); 36 float2x4 positionsRadii = hit.GetLssPositionsAndRadii(); 37 uint isSphereHit = uint(hit.IsSphereHit()); 38 uint isLssHit = uint(hit.IsLssHit()); 39 40 SomeValues objSomeValues = hit.GetAttributes<SomeValues>(); 41 42 r += instanceIndex; 43 r += instanceID; 44 r += geometryIndex; 45 r += primitiveIndex; 46 r += objSomeValues.a; 47 r += clusterID; 48 49 r += int(posRadius.x); 50 r += int(posRadius.y); 51 r += int(posRadius.z); 52 r += int(posRadius.w); 53 54 r += int(positionsRadii[0].x); 55 r += int(positionsRadii[0].y); 56 r += int(positionsRadii[0].z); 57 r += int(positionsRadii[0].w); 58 59 r += isSphereHit; 60 r += isLssHit; 61 } 62 63 return r; 64} 65 66void rayGenerationMain() 67{ 68 int2 launchID = int2(DispatchRaysIndex().xy); 69 int2 launchSize = int2(DispatchRaysDimensions().xy); 70 71 int idx = launchID.x; 72 73 SomeValues someValues = { idx, idx * 2.0f }; 74 75 RayDesc ray; 76 ray.Origin = float3(idx, 0, 0); 77 ray.TMin = 0.01f; 78 ray.Direction = float3(0, 1, 0); 79 ray.TMax = 1e4f; 80 81 RAY_FLAG rayFlags = RAY_FLAG_ACCEPT_FIRST_HIT_AND_END_SEARCH | RAY_FLAG_CULL_BACK_FACING_TRIANGLES; 82 uint instanceInclusionMask = 0xff; 83 uint rayContributionToHitGroupIndex = 0; 84 uint multiplierForGeometryContributionToHitGroupIndex = 4; 85 uint missShaderIndex = 0; 86 // SPIRV: OpHitObjectTraceRayNV 87 // CHECK: optixTraverse 88 HitObject hit = HitObject::TraceRay(scene, 89 rayFlags, 90 instanceInclusionMask, 91 rayContributionToHitGroupIndex, 92 multiplierForGeometryContributionToHitGroupIndex, 93 missShaderIndex, 94 ray, 95 someValues); 96 97 outputBuffer[idx] = calcValue(hit); 98}