Files
2026-05-06 23:44:13 +02:00

157 lines
4.0 KiB
Plaintext

#!amber
DEVICE_EXTENSION VK_KHR_acceleration_structure
DEVICE_EXTENSION VK_KHR_ray_tracing_pipeline
DEVICE_EXTENSION VK_KHR_buffer_device_address
DEVICE_EXTENSION VK_KHR_pipeline_library
DEVICE_FEATURE RayTracingPipelineFeaturesKHR.rayTracingPipeline
DEVICE_FEATURE AccelerationStructureFeaturesKHR.accelerationStructure
DEVICE_FEATURE BufferDeviceAddressFeatures.bufferDeviceAddress
SHADER ray_generation raygen1 GLSL
#version 460 core
#extension GL_EXT_ray_tracing : require
layout(location = 0) rayPayloadEXT uint payload;
layout(set = 0, binding = 0) uniform accelerationStructureEXT topLevelAS;
layout(set = 0, binding = 1, r32ui) uniform uimage2D result;
void main()
{
for (uint i = 0; i < 3; i++)
{
payload = 0;
// Set origin to trigger miss
traceRayEXT(
topLevelAS, // accelerationStructureEXT topLevel,
0u, // uint rayFlags
0xFFu, // uint cullMask,
0, // uint sbtRecordOffset,
0, // uint sbtRecordStride,
i, // uint missIndex,
vec3(0.0, 0.0, 0.0), // vec3 origin,
0.0, // float Tmin,
vec3(0.0, 0.0, -1.0), // vec3 direction,
0.25, // float Tmax,
0 // int payload
);
imageStore(result, ivec2(i, 0), uvec4(payload, 0u, 0u, 0u));
}
}
END
SHADER miss miss1 GLSL
#version 460 core
#extension GL_EXT_ray_tracing : require
layout(location = 0) rayPayloadInEXT uint payload;
void main()
{
payload = 1;
}
END
SHADER miss miss2 GLSL
#version 460 core
#extension GL_EXT_ray_tracing : require
layout(location = 0) rayPayloadInEXT uint payload;
void main()
{
payload = 2;
}
END
SHADER miss miss3 GLSL
#version 460 core
#extension GL_EXT_ray_tracing : require
layout(location = 0) rayPayloadInEXT uint payload;
void main()
{
payload = 3;
}
END
SHADER closest_hit closesthit1 GLSL
#version 460 core
#extension GL_EXT_ray_tracing : require
hitAttributeEXT vec3 attribs;
layout(location = 0) rayPayloadInEXT uint payload;
void main()
{
}
END
SHADER any_hit anyhit1 GLSL
#version 460 core
#extension GL_EXT_ray_tracing : require
hitAttributeEXT vec3 attribs;
layout(location = 0) rayPayloadInEXT uint payload;
void main()
{
}
END
ACCELERATION_STRUCTURE BOTTOM_LEVEL triangles
GEOMETRY TRIANGLES
-1 -1 1
-1 1 1
1 1 1
END
GEOMETRY TRIANGLES
1 1 1
1 -1 1
-1 -1 1
END
END
ACCELERATION_STRUCTURE TOP_LEVEL tlas1
BOTTOM_LEVEL_INSTANCE triangles
END
END
IMAGE img1 FORMAT R32_UINT DIM_2D WIDTH 4 HEIGHT 1 FILL 0
PIPELINE raytracing my_rtlib_bottom
MAX_RAY_PAYLOAD_SIZE 16
MAX_RAY_HIT_ATTRIBUTE_SIZE 16
BIND ACCELERATION_STRUCTURE tlas1 DESCRIPTOR_SET 0 BINDING 0
BIND BUFFER img1 AS storage_image DESCRIPTOR_SET 0 BINDING 1
FLAGS LIBRARY
SHADER_GROUP g_miss3 miss3
END
PIPELINE raytracing my_rtlib
USE_LIBRARY my_rtlib_bottom
MAX_RAY_PAYLOAD_SIZE 16
MAX_RAY_HIT_ATTRIBUTE_SIZE 16
BIND ACCELERATION_STRUCTURE tlas1 DESCRIPTOR_SET 0 BINDING 0
BIND BUFFER img1 AS storage_image DESCRIPTOR_SET 0 BINDING 1
FLAGS LIBRARY
SHADER_GROUP g_miss2 miss2
END
PIPELINE raytracing my_rtpipeline
USE_LIBRARY my_rtlib
MAX_RAY_PAYLOAD_SIZE 16
MAX_RAY_HIT_ATTRIBUTE_SIZE 16
BIND ACCELERATION_STRUCTURE tlas1 DESCRIPTOR_SET 0 BINDING 0
BIND BUFFER img1 AS storage_image DESCRIPTOR_SET 0 BINDING 1
SHADER_GROUP g_rgen raygen1
SHADER_GROUP g_miss1 miss1
SHADER_GROUP g_hits anyhit1 closesthit1
SHADER_BINDING_TABLE sbt_raygen
g_rgen
END
SHADER_BINDING_TABLE sbt_miss
g_miss1
g_miss2
g_miss3
END
SHADER_BINDING_TABLE sbt_hit
g_hits
END
END
RUN my_rtpipeline RAYGEN sbt_raygen MISS sbt_miss HIT sbt_hit 1 1 1
EXPECT img1 IDX 0 EQ 1 2 3