diff --git a/shaders/slang/_rename.py b/shaders/slang/_rename.py index 4b23aef0..375bae93 100644 --- a/shaders/slang/_rename.py +++ b/shaders/slang/_rename.py @@ -7,6 +7,11 @@ from shutil import move def checkRenameFiles(samplename): mappings = {} match samplename: + case "displacement": + mappings = { + "displacement.vert.spv": "base.vert.spv", + "displacement.frag.spv": "base.frag.spv", + } case "geometryshader": mappings = { "normaldebug.vert.spv": "base.vert.spv", @@ -18,6 +23,12 @@ def checkRenameFiles(samplename): "raytracingbasic.rmiss.spv": "miss.rmiss.spv", "raytracingbasic.rgen.spv": "raygen.rgen.spv", } + case "raytracingcallable": + mappings = { + "raytracingcallable.rchit.spv": "closesthit.rchit.spv", + "raytracingcallable.rmiss.spv": "miss.rmiss.spv", + "raytracingcallable.rgen.spv": "raygen.rgen.spv", + } case "raytracinggltf": mappings = { "raytracinggltf.rchit.spv": "closesthit.rchit.spv", diff --git a/shaders/slang/raytracingcallable/callable1.slang b/shaders/slang/raytracingcallable/callable1.slang new file mode 100644 index 00000000..afacce9a --- /dev/null +++ b/shaders/slang/raytracingcallable/callable1.slang @@ -0,0 +1,14 @@ +/* Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: MIT + * + */ + +[shader("callable")] +void callableMain(inout float3 outColor) +{ + // Generate a checker board pattern + float2 pos = float2(DispatchRaysIndex().x / 8, DispatchRaysIndex().y / 8); + float col = (pos.x + (pos.y % 2.0)) % 2.0; + outColor = float3(col, col, col); +} \ No newline at end of file diff --git a/shaders/slang/raytracingcallable/callable2.slang b/shaders/slang/raytracingcallable/callable2.slang new file mode 100644 index 00000000..de51b24d --- /dev/null +++ b/shaders/slang/raytracingcallable/callable2.slang @@ -0,0 +1,11 @@ +/* Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: MIT + * + */ + +[shader("callable")] +void callableMain(inout float3 outColor) +{ + outColor = float3(0.0, 1.0, 0.0); +} \ No newline at end of file diff --git a/shaders/slang/raytracingcallable/callable3.slang b/shaders/slang/raytracingcallable/callable3.slang new file mode 100644 index 00000000..75ca336a --- /dev/null +++ b/shaders/slang/raytracingcallable/callable3.slang @@ -0,0 +1,14 @@ +/* Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: MIT + * + */ + +[shader("callable")] +void callableMain(inout float3 outColor) +{ + // Generate a checker board pattern + float2 pos = float2(DispatchRaysIndex().x / 8, DispatchRaysIndex().y / 8); + float col = pos.y % 2.0; + outColor = float3(col, col, col); +} \ No newline at end of file diff --git a/shaders/slang/raytracingcallable/raytracingcallable.slang b/shaders/slang/raytracingcallable/raytracingcallable.slang new file mode 100644 index 00000000..e125f455 --- /dev/null +++ b/shaders/slang/raytracingcallable/raytracingcallable.slang @@ -0,0 +1,68 @@ +/* Copyright (c) 2025, Sascha Willems + * + * SPDX-License-Identifier: MIT + * + */ + +RaytracingAccelerationStructure accelStruct; +RWTexture2D image; +struct CameraProperties +{ + float4x4 viewInverse; + float4x4 projInverse; +}; +ConstantBuffer cam; + +struct Payload +{ + float3 hitValue; +}; + +struct CallData +{ + float3 outColor; +}; + +struct Attributes +{ + float2 bary; +}; + +[shader("raygeneration")] +void raygenerationMain() +{ + uint3 LaunchID = DispatchRaysIndex(); + uint3 LaunchSize = DispatchRaysDimensions(); + + const float2 pixelCenter = float2(LaunchID.xy) + float2(0.5, 0.5); + const float2 inUV = pixelCenter / float2(LaunchSize.xy); + float2 d = inUV * 2.0 - 1.0; + float4 target = mul(cam.projInverse, float4(d.x, d.y, 1, 1)); + + RayDesc rayDesc; + rayDesc.Origin = mul(cam.viewInverse, float4(0, 0, 0, 1)).xyz; + rayDesc.Direction = mul(cam.viewInverse, float4(normalize(target.xyz), 0)).xyz; + rayDesc.TMin = 0.001; + rayDesc.TMax = 10000.0; + + Payload payload; + TraceRay(accelStruct, RAY_FLAG_FORCE_OPAQUE, 0xff, 0, 0, 0, rayDesc, payload); + + image[int2(LaunchID.xy)] = float4(payload.hitValue, 0.0); +} + +[shader("closesthit")] +void closesthitMain(inout Payload p, in Attributes attribs) +{ + // Execute the callable shader indexed by the current geometry being hit + // For our sample this means that the first callable shader in the SBT is invoked for the first triangle, the second callable shader for the second triangle, etc. + CallData callData; + CallShader(GeometryIndex(), callData); + p.hitValue = callData.outColor; +} + +[shader("miss")] +void missMain(inout Payload p) +{ + p.hitValue = float3(0.0, 0.0, 0.2); +} \ No newline at end of file