mirror of
https://github.com/w23/xash3d-fwgs
synced 2024-12-17 14:59:57 +01:00
rtx: fix shadows for surfaces with alpha mask
This commit is contained in:
parent
e831a9c9dd
commit
6e9b54869c
@ -65,7 +65,7 @@ bool shadowed(vec3 pos, vec3 dir, float dist) {
|
|||||||
traceRayEXT(tlas,
|
traceRayEXT(tlas,
|
||||||
flags,
|
flags,
|
||||||
GEOMETRY_BIT_OPAQUE,
|
GEOMETRY_BIT_OPAQUE,
|
||||||
0, 0, SHADER_OFFSET_MISS_SHADOW,
|
SHADER_OFFSET_HIT_SHADOW_BASE, SBT_RECORD_SIZE, SHADER_OFFSET_MISS_SHADOW,
|
||||||
pos, 0., dir, dist - shadow_offset_fudge, PAYLOAD_LOCATION_SHADOW);
|
pos, 0., dir, dist - shadow_offset_fudge, PAYLOAD_LOCATION_SHADOW);
|
||||||
return payload_shadow.hit_type == SHADOW_HIT;
|
return payload_shadow.hit_type == SHADOW_HIT;
|
||||||
}
|
}
|
||||||
@ -82,7 +82,7 @@ bool shadowedSky(vec3 pos, vec3 dir, float dist) {
|
|||||||
traceRayEXT(tlas,
|
traceRayEXT(tlas,
|
||||||
flags,
|
flags,
|
||||||
GEOMETRY_BIT_OPAQUE,
|
GEOMETRY_BIT_OPAQUE,
|
||||||
SHADER_OFFSET_HIT_SHADOW, SBT_RECORD_SIZE, SHADER_OFFSET_MISS_SHADOW,
|
SHADER_OFFSET_HIT_SHADOW_BASE, SBT_RECORD_SIZE, SHADER_OFFSET_MISS_SHADOW,
|
||||||
pos, 0., dir, dist - shadow_offset_fudge, PAYLOAD_LOCATION_SHADOW);
|
pos, 0., dir, dist - shadow_offset_fudge, PAYLOAD_LOCATION_SHADOW);
|
||||||
return payload_shadow.hit_type != SHADOW_SKY;
|
return payload_shadow.hit_type != SHADOW_SKY;
|
||||||
}
|
}
|
||||||
|
@ -32,7 +32,9 @@ layout (constant_id = 3) const uint MAX_VISIBLE_SURFACE_LIGHTS = 255;
|
|||||||
#define SHADER_OFFSET_HIT_REGULAR 0
|
#define SHADER_OFFSET_HIT_REGULAR 0
|
||||||
#define SHADER_OFFSET_HIT_ALPHA_TEST 1
|
#define SHADER_OFFSET_HIT_ALPHA_TEST 1
|
||||||
#define SHADER_OFFSET_HIT_ADDITIVE 2
|
#define SHADER_OFFSET_HIT_ADDITIVE 2
|
||||||
#define SHADER_OFFSET_HIT_SHADOW 3
|
|
||||||
|
#define SHADER_OFFSET_HIT_REGULAR_BASE 0
|
||||||
|
#define SHADER_OFFSET_HIT_SHADOW_BASE 3
|
||||||
|
|
||||||
#define KUSOK_MATERIAL_FLAG_SKYBOX 0x80000000
|
#define KUSOK_MATERIAL_FLAG_SKYBOX 0x80000000
|
||||||
|
|
||||||
|
@ -28,11 +28,13 @@ enum {
|
|||||||
ShaderBindingTable_Miss_Shadow,
|
ShaderBindingTable_Miss_Shadow,
|
||||||
ShaderBindingTable_Miss_Empty,
|
ShaderBindingTable_Miss_Empty,
|
||||||
|
|
||||||
ShaderBindingTable_Hit,
|
ShaderBindingTable_Hit_Base,
|
||||||
ShaderBindingTable_Hit_WithAlphaTest,
|
ShaderBindingTable_Hit_WithAlphaTest,
|
||||||
ShaderBindingTable_Hit_Additive,
|
ShaderBindingTable_Hit_Additive,
|
||||||
ShaderBindingTable_Hit_Shadow,
|
|
||||||
ShaderBindingTable_Hit__END = ShaderBindingTable_Hit_Shadow,
|
ShaderBindingTable_Hit_Shadow_Base,
|
||||||
|
ShaderBindingTable_Hit_Shadow_AlphaTest,
|
||||||
|
ShaderBindingTable_Hit__END = ShaderBindingTable_Hit_Shadow_AlphaTest,
|
||||||
|
|
||||||
ShaderBindingTable_COUNT
|
ShaderBindingTable_COUNT
|
||||||
};
|
};
|
||||||
@ -431,15 +433,18 @@ static void createPipeline( void )
|
|||||||
|
|
||||||
// TODO static assert
|
// TODO static assert
|
||||||
#define ASSERT_SHADER_OFFSET(sbt_kind, sbt_index, offset) \
|
#define ASSERT_SHADER_OFFSET(sbt_kind, sbt_index, offset) \
|
||||||
ASSERT(offset == (sbt_index - sbt_kind))
|
ASSERT((offset) == (sbt_index - sbt_kind))
|
||||||
|
|
||||||
ASSERT_SHADER_OFFSET(ShaderBindingTable_RayGen, ShaderBindingTable_RayGen, 0);
|
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, SHADER_OFFSET_MISS_REGULAR);
|
||||||
ASSERT_SHADER_OFFSET(ShaderBindingTable_Miss, ShaderBindingTable_Miss_Shadow, SHADER_OFFSET_MISS_SHADOW);
|
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);
|
ASSERT_SHADER_OFFSET(ShaderBindingTable_Hit_Base, ShaderBindingTable_Hit_Base, SHADER_OFFSET_HIT_REGULAR_BASE + SHADER_OFFSET_HIT_REGULAR);
|
||||||
ASSERT_SHADER_OFFSET(ShaderBindingTable_Hit, ShaderBindingTable_Hit_Additive, SHADER_OFFSET_HIT_ADDITIVE);
|
ASSERT_SHADER_OFFSET(ShaderBindingTable_Hit_Base, ShaderBindingTable_Hit_WithAlphaTest, SHADER_OFFSET_HIT_REGULAR_BASE + SHADER_OFFSET_HIT_ALPHA_TEST);
|
||||||
ASSERT_SHADER_OFFSET(ShaderBindingTable_Hit, ShaderBindingTable_Hit_Shadow, SHADER_OFFSET_HIT_SHADOW);
|
ASSERT_SHADER_OFFSET(ShaderBindingTable_Hit_Base, ShaderBindingTable_Hit_Additive, SHADER_OFFSET_HIT_REGULAR_BASE + SHADER_OFFSET_HIT_ADDITIVE);
|
||||||
|
|
||||||
|
ASSERT_SHADER_OFFSET(ShaderBindingTable_Hit_Base, ShaderBindingTable_Hit_Shadow_Base, SHADER_OFFSET_HIT_SHADOW_BASE + 0);
|
||||||
|
ASSERT_SHADER_OFFSET(ShaderBindingTable_Hit_Base, ShaderBindingTable_Hit_Shadow_AlphaTest, SHADER_OFFSET_HIT_SHADOW_BASE + SHADER_OFFSET_HIT_ALPHA_TEST);
|
||||||
|
|
||||||
shader_groups[ShaderBindingTable_RayGen] = (VkRayTracingShaderGroupCreateInfoKHR) {
|
shader_groups[ShaderBindingTable_RayGen] = (VkRayTracingShaderGroupCreateInfoKHR) {
|
||||||
.sType = VK_STRUCTURE_TYPE_RAY_TRACING_SHADER_GROUP_CREATE_INFO_KHR,
|
.sType = VK_STRUCTURE_TYPE_RAY_TRACING_SHADER_GROUP_CREATE_INFO_KHR,
|
||||||
@ -477,7 +482,7 @@ static void createPipeline( void )
|
|||||||
.intersectionShader = VK_SHADER_UNUSED_KHR,
|
.intersectionShader = VK_SHADER_UNUSED_KHR,
|
||||||
};
|
};
|
||||||
|
|
||||||
shader_groups[ShaderBindingTable_Hit] = (VkRayTracingShaderGroupCreateInfoKHR) {
|
shader_groups[ShaderBindingTable_Hit_Base] = (VkRayTracingShaderGroupCreateInfoKHR) {
|
||||||
.sType = VK_STRUCTURE_TYPE_RAY_TRACING_SHADER_GROUP_CREATE_INFO_KHR,
|
.sType = VK_STRUCTURE_TYPE_RAY_TRACING_SHADER_GROUP_CREATE_INFO_KHR,
|
||||||
.type = VK_RAY_TRACING_SHADER_GROUP_TYPE_TRIANGLES_HIT_GROUP_KHR,
|
.type = VK_RAY_TRACING_SHADER_GROUP_TYPE_TRIANGLES_HIT_GROUP_KHR,
|
||||||
.anyHitShader = VK_SHADER_UNUSED_KHR,
|
.anyHitShader = VK_SHADER_UNUSED_KHR,
|
||||||
@ -504,7 +509,7 @@ static void createPipeline( void )
|
|||||||
.intersectionShader = VK_SHADER_UNUSED_KHR,
|
.intersectionShader = VK_SHADER_UNUSED_KHR,
|
||||||
};
|
};
|
||||||
|
|
||||||
shader_groups[ShaderBindingTable_Hit_Shadow] = (VkRayTracingShaderGroupCreateInfoKHR) {
|
shader_groups[ShaderBindingTable_Hit_Shadow_Base] = (VkRayTracingShaderGroupCreateInfoKHR) {
|
||||||
.sType = VK_STRUCTURE_TYPE_RAY_TRACING_SHADER_GROUP_CREATE_INFO_KHR,
|
.sType = VK_STRUCTURE_TYPE_RAY_TRACING_SHADER_GROUP_CREATE_INFO_KHR,
|
||||||
.type = VK_RAY_TRACING_SHADER_GROUP_TYPE_TRIANGLES_HIT_GROUP_KHR,
|
.type = VK_RAY_TRACING_SHADER_GROUP_TYPE_TRIANGLES_HIT_GROUP_KHR,
|
||||||
.anyHitShader = VK_SHADER_UNUSED_KHR,
|
.anyHitShader = VK_SHADER_UNUSED_KHR,
|
||||||
@ -513,6 +518,15 @@ static void createPipeline( void )
|
|||||||
.intersectionShader = VK_SHADER_UNUSED_KHR,
|
.intersectionShader = VK_SHADER_UNUSED_KHR,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
shader_groups[ShaderBindingTable_Hit_Shadow_AlphaTest] = (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_AlphaTest,
|
||||||
|
.closestHitShader = ShaderStageIndex_ClosestHit_Shadow,
|
||||||
|
.generalShader = VK_SHADER_UNUSED_KHR,
|
||||||
|
.intersectionShader = VK_SHADER_UNUSED_KHR,
|
||||||
|
};
|
||||||
|
|
||||||
XVK_CHECK(vkCreateRayTracingPipelinesKHR(vk_core.device, VK_NULL_HANDLE, g_pipeline_cache, 1, &rtpci, NULL, &g_rtx.pipeline));
|
XVK_CHECK(vkCreateRayTracingPipelinesKHR(vk_core.device, VK_NULL_HANDLE, g_pipeline_cache, 1, &rtpci, NULL, &g_rtx.pipeline));
|
||||||
ASSERT(g_rtx.pipeline != VK_NULL_HANDLE);
|
ASSERT(g_rtx.pipeline != VK_NULL_HANDLE);
|
||||||
|
|
||||||
@ -551,6 +565,7 @@ static void prepareTlas( VkCommandBuffer cmdbuf ) {
|
|||||||
switch (model->material_mode) {
|
switch (model->material_mode) {
|
||||||
case MaterialMode_Opaque:
|
case MaterialMode_Opaque:
|
||||||
inst[i].mask = GEOMETRY_BIT_OPAQUE;
|
inst[i].mask = GEOMETRY_BIT_OPAQUE;
|
||||||
|
inst[i].instanceShaderBindingTableRecordOffset = SHADER_OFFSET_HIT_REGULAR,
|
||||||
inst[i].flags = VK_GEOMETRY_INSTANCE_FORCE_OPAQUE_BIT_KHR;
|
inst[i].flags = VK_GEOMETRY_INSTANCE_FORCE_OPAQUE_BIT_KHR;
|
||||||
break;
|
break;
|
||||||
case MaterialMode_Opaque_AlphaTest:
|
case MaterialMode_Opaque_AlphaTest:
|
||||||
@ -560,6 +575,7 @@ static void prepareTlas( VkCommandBuffer cmdbuf ) {
|
|||||||
break;
|
break;
|
||||||
case MaterialMode_Refractive:
|
case MaterialMode_Refractive:
|
||||||
inst[i].mask = GEOMETRY_BIT_REFRACTIVE;
|
inst[i].mask = GEOMETRY_BIT_REFRACTIVE;
|
||||||
|
inst[i].instanceShaderBindingTableRecordOffset = SHADER_OFFSET_HIT_REGULAR,
|
||||||
inst[i].flags = VK_GEOMETRY_INSTANCE_FORCE_OPAQUE_BIT_KHR;
|
inst[i].flags = VK_GEOMETRY_INSTANCE_FORCE_OPAQUE_BIT_KHR;
|
||||||
break;
|
break;
|
||||||
case MaterialMode_Additive:
|
case MaterialMode_Additive:
|
||||||
@ -759,7 +775,7 @@ LIST_GBUFFER_IMAGES(GBUFFER_WRITE_BARRIER)
|
|||||||
}
|
}
|
||||||
const VkStridedDeviceAddressRegionKHR sbt_raygen = SBT_INDEX(ShaderBindingTable_RayGen, 1);
|
const VkStridedDeviceAddressRegionKHR sbt_raygen = SBT_INDEX(ShaderBindingTable_RayGen, 1);
|
||||||
const VkStridedDeviceAddressRegionKHR sbt_miss = SBT_INDEX(ShaderBindingTable_Miss, ShaderBindingTable_Miss_Empty - ShaderBindingTable_Miss);
|
const VkStridedDeviceAddressRegionKHR sbt_miss = SBT_INDEX(ShaderBindingTable_Miss, ShaderBindingTable_Miss_Empty - ShaderBindingTable_Miss);
|
||||||
const VkStridedDeviceAddressRegionKHR sbt_hit = SBT_INDEX(ShaderBindingTable_Hit, ShaderBindingTable_Hit__END - ShaderBindingTable_Hit);
|
const VkStridedDeviceAddressRegionKHR sbt_hit = SBT_INDEX(ShaderBindingTable_Hit_Base, ShaderBindingTable_Hit__END - ShaderBindingTable_Hit_Base);
|
||||||
const VkStridedDeviceAddressRegionKHR sbt_callable = { 0 };
|
const VkStridedDeviceAddressRegionKHR sbt_callable = { 0 };
|
||||||
|
|
||||||
vkCmdTraceRaysKHR(cmdbuf, &sbt_raygen, &sbt_miss, &sbt_hit, &sbt_callable, FRAME_WIDTH, FRAME_HEIGHT, 1 );
|
vkCmdTraceRaysKHR(cmdbuf, &sbt_raygen, &sbt_miss, &sbt_hit, &sbt_callable, FRAME_WIDTH, FRAME_HEIGHT, 1 );
|
||||||
|
Loading…
Reference in New Issue
Block a user