yum-mirror/slang
Making it easier to work with shaders
git clone https://git.yummers.dev/yum-mirror/slang
f02b08490
master
1 2//TEST(compute):COMPARE_COMPUTE:-d3d12 -output-using-type -profile sm_6_5 -render-feature ray-query 3//TEST(compute):COMPARE_COMPUTE:-vk -output-using-type -render-feature ray-query 4 5//TEST_INPUT: set scene = AccelerationStructure 6uniform RaytracingAccelerationStructure scene; 7 8struct Ray 9{ 10 float3 origin; 11 float tMin; 12 float3 dir; 13 float tMax; 14 15 /** 16 * Initializes a ray. 17 */ 18 __init(float3 origin, float3 dir, float tMin = 0.f, float tMax = 10000.0) 19 { 20 this.origin = origin; 21 this.dir = dir; 22 this.tMin = tMin; 23 this.tMax = tMax; 24 } 25 26 /** 27 * Convert to DXR RayDesc. 28 */ 29 RayDesc toRayDesc() { return { origin, tMin, dir, tMax }; } 30 31 /** 32 * Evaluate position on the ray. 33 * @param[in] t Ray parameter. 34 * @return Returns evaluated position. 35 */ 36 float3 eval(float t) { return origin + t * dir; } 37}; 38 39uint getCommittedStatus<let Flags : int>(RayQuery<Flags> q) 40{ 41 return q.CommittedStatus(); 42} 43 44bool traceSceneVisibilityRayImpl<let Flags : int>(const bool useAlphaTest, inout RayQuery<Flags> q, const Ray ray, uint rayFlags, uint instanceInclusionMask) 45{ 46 var rayDesc = ray.toRayDesc(); 47 q.TraceRayInline( 48 scene, 49 rayFlags, 50 0xff, 51 rayDesc); 52 q.Proceed(); 53 if (getCommittedStatus(q) == COMMITTED_TRIANGLE_HIT) 54 { 55 q.CommittedRayT(); 56 return true; 57 } 58 return false; 59} 60 61bool traceSceneVisibilityRay<let UseAlphaTest : int>(const Ray ray, uint rayFlags, uint instanceInclusionMask) 62{ 63 RayQuery rayQuery; 64 return traceSceneVisibilityRayImpl(false, rayQuery, ray, rayFlags, instanceInclusionMask); 65} 66 67//TEST_INPUT:set outputBuffer = out ubuffer(data=[0], stride=4) 68RWStructuredBuffer<float> outputBuffer; 69 70[shader("compute")] 71[numthreads(1, 1, 1)] 72void computeMain( 73 uint3 threadIdx: SV_DispatchThreadID) 74{ 75 Ray ray = Ray(float3(0.1, 0.1, 0.0), float3(0, 0, 1), 0.1); 76 if (traceSceneVisibilityRay<0>(ray, 0, 0xffff)) 77 outputBuffer[threadIdx.x] = 1.0; 78}