From 1fe0f5ffd5ea09d622f59f38abf15298f17381dc Mon Sep 17 00:00:00 2001 From: Bill Currie Date: Wed, 2 Aug 2023 19:34:37 +0900 Subject: [PATCH] [vulkan] Get spotlight shadows working They currently have a hard-coded bias of 0.5 pixels (if I'm doing my math correctly) to combat the shadow acne, but look pretty good. --- libs/video/renderer/vulkan/rp_main_def.plist | 2 +- libs/video/renderer/vulkan/shader/lighting_plane.frag | 9 ++++++++- libs/video/renderer/vulkan/smp_quake.plist | 2 +- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/libs/video/renderer/vulkan/rp_main_def.plist b/libs/video/renderer/vulkan/rp_main_def.plist index 17ba2f3a8..2623a883e 100644 --- a/libs/video/renderer/vulkan/rp_main_def.plist +++ b/libs/video/renderer/vulkan/rp_main_def.plist @@ -1555,7 +1555,7 @@ renderpasses = { color = { light = { layout = color_attachment_optimal; - blend = $blend_disable; + blend = $additive_blend; }; }; preserve = (depth, output); diff --git a/libs/video/renderer/vulkan/shader/lighting_plane.frag b/libs/video/renderer/vulkan/shader/lighting_plane.frag index 7f453a0ed..0c9ea196c 100644 --- a/libs/video/renderer/vulkan/shader/lighting_plane.frag +++ b/libs/video/renderer/vulkan/shader/lighting_plane.frag @@ -1,12 +1,19 @@ #version 450 #extension GL_GOOGLE_include_directive : enable +layout (set = 0, binding = 0) buffer ShadowMatrices { + mat4 shadow_mats[]; +}; layout (set = 3, binding = 0) uniform sampler2DArrayShadow shadow_map[32]; float shadow (uint map_id, uint layer, uint mat_id, vec3 pos) { - return 1; + vec4 p = shadow_mats[mat_id] * vec4 (pos, 1); + p = p / (p.w - 0.5); //FIXME hard-coded bias + float depth = p.z; + vec2 uv = (p.xy + vec2(1)) / 2; + return texture (shadow_map[map_id], vec4 (uv, layer, depth)); } #include "lighting_main.finc" diff --git a/libs/video/renderer/vulkan/smp_quake.plist b/libs/video/renderer/vulkan/smp_quake.plist index 8878bb399..6d34ff8c8 100644 --- a/libs/video/renderer/vulkan/smp_quake.plist +++ b/libs/video/renderer/vulkan/smp_quake.plist @@ -112,7 +112,7 @@ samplers = { anisotropyEnable = false; maxAnisotropy = 0; compareEnable = true; - compareOp = less; + compareOp = greater_or_equal; minLod = 0; maxLod = 1000; borderColor = float_opaque_white;