yum-mirror/slang
Making it easier to work with shaders
git clone https://git.yummers.dev/yum-mirror/slang
f02b08490
master
1// hit-object-array.slang 2 3//TEST:SIMPLE: -target dxil -entry rayGenerationMain -stage raygeneration -profile sm_6_5 -DNV_SHADER_EXTN_SLOT=u0 4 5/* This doesn't work correctly currently because it produces assignments to the HitObject array in GLSL output. 6But that is not valid for hitObjectNV int he extension */ 7 8//DISABLE_TEST:SIMPLE: -target glsl -entry rayGenerationMain -stage raygeneration -profile sm_6_5 -line-directive-mode none 9 10//DISABLE_TEST(compute):COMPARE_COMPUTE:-d3d12 -output-using-type -profile sm_6_5 -render-feature ray-query 11//DISABLE_TEST(compute):COMPARE_COMPUTE:-vk -output-using-type -render-feature ray-query 12 13//TEST_INPUT: set scene = AccelerationStructure 14uniform RaytracingAccelerationStructure scene; 15 16//TEST_INPUT:set outputBuffer = out ubuffer(data=[0, 0, 0, 0], stride=4) 17RWStructuredBuffer<uint> outputBuffer; 18 19struct SomeValues 20{ 21 int a; 22 float b; 23}; 24 25uint calcValue(HitObject hit) 26{ 27 uint r = 0; 28 29 if (hit.IsHit()) 30 { 31 uint instanceIndex = hit.GetInstanceIndex(); 32 uint instanceID = hit.GetInstanceID(); 33 uint geometryIndex = hit.GetGeometryIndex(); 34 uint primitiveIndex = hit.GetPrimitiveIndex(); 35 uint hitKind = hit.GetHitKind(); 36 37 r += hitKind; 38 r += instanceIndex; 39 r += instanceID; 40 r += geometryIndex; 41 r += primitiveIndex; 42 43 RayDesc ray = hit.GetRayDesc(); 44 45 r += uint(ray.TMin > 0); 46 r += uint(ray.TMax < ray.TMin); 47 48 SomeValues objSomeValues = hit.GetAttributes<SomeValues>(); 49 50 r += objSomeValues.a; 51 } 52 else if (hit.IsMiss()) 53 { 54 r += 1; 55 } 56 57 return r; 58} 59 60void rayGenerationMain() 61{ 62 int2 launchID = int2(DispatchRaysIndex().xy); 63 int2 launchSize = int2(DispatchRaysDimensions().xy); 64 65 int idx = launchID.x; 66 67 SomeValues someValues = { idx, idx * 2.0f }; 68 69 RayDesc ray; 70 ray.Origin = float3(idx, 0, 0); 71 ray.TMin = 0.01f; 72 ray.Direction = float3(0, 1, 0); 73 ray.TMax = 1e4f; 74 75 uint hitKind = 0; 76 77 HitObject hitObjs[2]; 78 79 hitObjs[0] = HitObject::MakeHit(0, scene, idx, idx * 2, idx * 3, hitKind, ray, someValues); 80 81 { 82 int rayContributionToHitGroupIndex = 0; 83 int multiplierForGeometryContributionToHitGroupIndex = 4; 84 85 hitObjs[1] = HitObject::MakeHit(scene, 86 idx, 87 idx * 2, 88 idx * 3, 89 hitKind, 90 rayContributionToHitGroupIndex, 91 multiplierForGeometryContributionToHitGroupIndex, 92 ray, 93 someValues); 94 } 95 96 97 uint r = calcValue(hitObjs[0]) + calcValue(hitObjs[1]); 98 99 outputBuffer[idx] = r; 100}