diff --git a/ref_vk/shaders/ray.rgen b/ref_vk/shaders/ray.rgen index df47caec..90f71c3c 100644 --- a/ref_vk/shaders/ray.rgen +++ b/ref_vk/shaders/ray.rgen @@ -55,9 +55,7 @@ bool shadowed(vec3 pos, vec3 dir, float dist) { traceRayEXT(tlas, flags, GEOMETRY_BIT_OPAQUE, - 0, 0, 1 /* miss index */, - pos, 0., dir, dist - shadow_offset_fudge, 1 /* payload location */); - return shadow; + 0, 0, SHADER_OFFSET_MISS_SHADOW, } const float color_factor = 1000.; diff --git a/ref_vk/shaders/ray_interop.h b/ref_vk/shaders/ray_interop.h index 0cfccd72..74d17170 100644 --- a/ref_vk/shaders/ray_interop.h +++ b/ref_vk/shaders/ray_interop.h @@ -23,7 +23,12 @@ layout (constant_id = 3) const uint MAX_VISIBLE_SURFACE_LIGHTS = 255; #define GEOMETRY_BIT_OPAQUE 0x01 #define GEOMETRY_BIT_ADDITIVE 0x02 -#define GEOMETRY_BIT_ANY 0xff + +#define SHADER_OFFSET_MISS_REGULAR 0 +#define SHADER_OFFSET_MISS_SHADOW 1 + +#define SHADER_OFFSET_HIT_REGULAR 0 +#define SHADER_OFFSET_HIT_ALPHA_TEST 1 struct Kusok { uint index_offset; diff --git a/ref_vk/vk_rtx.c b/ref_vk/vk_rtx.c index 4d310baa..68a8ddfc 100644 --- a/ref_vk/vk_rtx.c +++ b/ref_vk/vk_rtx.c @@ -22,10 +22,13 @@ enum { ShaderBindingTable_RayGen, + ShaderBindingTable_Miss, ShaderBindingTable_Miss_Shadow, + ShaderBindingTable_Hit, - ShaderBindingTable_HitWithAlphaMask, + ShaderBindingTable_Hit_WithAlphaTest, + ShaderBindingTable_COUNT }; @@ -362,12 +365,12 @@ static void createPipeline( void ) ShaderStageIndex_Miss, ShaderStageIndex_Miss_Shadow, ShaderStageIndex_ClosestHit, - ShaderStageIndex_AnyHit_AlphaMask, + ShaderStageIndex_AnyHit_AlphaTest, ShaderStageIndex_COUNT, }; -#define DEFINE_SHADER(filename, bit, index) \ - shaders[ShaderStageIndex_##index] = (VkPipelineShaderStageCreateInfo){ \ +#define DEFINE_SHADER(filename, bit, sbt_index) \ + shaders[sbt_index] = (VkPipelineShaderStageCreateInfo){ \ .sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, \ .stage = VK_SHADER_STAGE_##bit##_BIT_KHR, \ .module = loadShader(filename), \ @@ -389,11 +392,20 @@ static void createPipeline( void ) .layout = g_rtx.descriptors.pipeline_layout, }; - DEFINE_SHADER("ray.rgen.spv", RAYGEN, RayGen); - DEFINE_SHADER("ray.rmiss.spv", MISS, Miss); - DEFINE_SHADER("shadow.rmiss.spv", MISS, Miss_Shadow); - DEFINE_SHADER("ray.rchit.spv", CLOSEST_HIT, ClosestHit); - DEFINE_SHADER("alphamask.rahit.spv", ANY_HIT, AnyHit_AlphaMask); + DEFINE_SHADER("ray.rgen.spv", RAYGEN, ShaderStageIndex_RayGen); + DEFINE_SHADER("ray.rmiss.spv", MISS, ShaderStageIndex_Miss); + DEFINE_SHADER("shadow.rmiss.spv", MISS, ShaderStageIndex_Miss_Shadow); + DEFINE_SHADER("ray.rchit.spv", CLOSEST_HIT, ShaderStageIndex_ClosestHit); + DEFINE_SHADER("alphamask.rahit.spv", ANY_HIT, ShaderStageIndex_AnyHit_AlphaTest); + +#define ASSERT_SHADER_OFFSET(sbt_kind, sbt_index, offset) \ + ASSERT(offset == (sbt_index - sbt_kind)) + + ASSERT_SHADER_OFFSET(ShaderBindingTable_RayGen, ShaderBindingTable_RayGen, 0); + ASSERT_SHADER_OFFSET(ShaderBindingTable_Miss, ShaderBindingTable_Miss, SHADER_OFFSET_MISS_REGULAR); + ASSERT_SHADER_OFFSET(ShaderBindingTable_Miss, ShaderBindingTable_Miss_Shadow, SHADER_OFFSET_MISS_SHADOW); + ASSERT_SHADER_OFFSET(ShaderBindingTable_Hit, ShaderBindingTable_Hit, SHADER_OFFSET_HIT_REGULAR); + ASSERT_SHADER_OFFSET(ShaderBindingTable_Hit, ShaderBindingTable_Hit_WithAlphaTest, SHADER_OFFSET_HIT_ALPHA_TEST); shader_groups[ShaderBindingTable_RayGen] = (VkRayTracingShaderGroupCreateInfoKHR) { .sType = VK_STRUCTURE_TYPE_RAY_TRACING_SHADER_GROUP_CREATE_INFO_KHR, @@ -431,10 +443,10 @@ static void createPipeline( void ) .intersectionShader = VK_SHADER_UNUSED_KHR, }; - shader_groups[ShaderBindingTable_HitWithAlphaMask] = (VkRayTracingShaderGroupCreateInfoKHR) { + shader_groups[ShaderBindingTable_Hit_WithAlphaTest] = (VkRayTracingShaderGroupCreateInfoKHR) { .sType = VK_STRUCTURE_TYPE_RAY_TRACING_SHADER_GROUP_CREATE_INFO_KHR, .type = VK_RAY_TRACING_SHADER_GROUP_TYPE_TRIANGLES_HIT_GROUP_KHR, - .anyHitShader = ShaderStageIndex_AnyHit_AlphaMask, + .anyHitShader = ShaderStageIndex_AnyHit_AlphaTest, .closestHitShader = ShaderStageIndex_ClosestHit, .generalShader = VK_SHADER_UNUSED_KHR, .intersectionShader = VK_SHADER_UNUSED_KHR,