From e75d8d35eb3a3f37488aff0782cac2ad88177be1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20Lu=C3=ADs=20Vaz=20Silva?= Date: Thu, 2 Jan 2025 11:30:44 -0300 Subject: [PATCH] move gl_light_shadow_filter from HWViewpointUniforms to VkShaderKey --- .../hwrenderer/data/hw_renderstate.h | 1 - .../hwrenderer/data/hw_viewpointuniforms.h | 1 - .../rendering/vulkan/shaders/vk_shader.cpp | 5 ++++ .../rendering/vulkan/shaders/vk_shader.h | 3 ++- .../rendering/vulkan/vk_renderstate.cpp | 3 +++ .../hwrenderer/scene/hw_drawinfo.cpp | 1 - .../shaders/scene/binding_rsbuffers.glsl | 1 - wadsrc/static/shaders/scene/light_shadow.glsl | 27 ++++++++++--------- 8 files changed, 24 insertions(+), 18 deletions(-) diff --git a/src/common/rendering/hwrenderer/data/hw_renderstate.h b/src/common/rendering/hwrenderer/data/hw_renderstate.h index a8c5f0a0f..4e22ed3e4 100644 --- a/src/common/rendering/hwrenderer/data/hw_renderstate.h +++ b/src/common/rendering/hwrenderer/data/hw_renderstate.h @@ -645,7 +645,6 @@ public: matrices.mGlobVis = 1.f; matrices.mPalLightLevels = palLightLevels; matrices.mClipLine.X = -10000000.0f; - matrices.mShadowFilter = gl_light_shadow_filter; matrices.mProjectionMatrix.ortho(0, (float)width, (float)height, 0, -1.0f, 1.0f); matrices.CalcDependencies(); return SetViewpoint(matrices); diff --git a/src/common/rendering/hwrenderer/data/hw_viewpointuniforms.h b/src/common/rendering/hwrenderer/data/hw_viewpointuniforms.h index 04e4a31ae..086d49cf2 100644 --- a/src/common/rendering/hwrenderer/data/hw_viewpointuniforms.h +++ b/src/common/rendering/hwrenderer/data/hw_viewpointuniforms.h @@ -37,7 +37,6 @@ struct HWViewpointUniforms int mViewHeight = 0; float mClipHeight = 0.f; float mClipHeightDirection = 0.f; - int mShadowFilter = 1; int mLightTilesWidth = 0; diff --git a/src/common/rendering/vulkan/shaders/vk_shader.cpp b/src/common/rendering/vulkan/shaders/vk_shader.cpp index 66293a7c3..23197f218 100644 --- a/src/common/rendering/vulkan/shaders/vk_shader.cpp +++ b/src/common/rendering/vulkan/shaders/vk_shader.cpp @@ -256,6 +256,11 @@ std::unique_ptr VkShaderManager::LoadFragShader(FString shadername if (key.UseRaytrace) definesBlock << "#define USE_RAYTRACE\n"; if (key.UseRaytracePrecise) definesBlock << "#define USE_RAYTRACE_PRECISE\n"; + + definesBlock << "#define SHADOWMAP_FILTER "; + definesBlock << std::to_string(key.ShadowmapFilter).c_str(); + definesBlock << "\n"; + if (key.UseShadowmap) definesBlock << "#define USE_SHADOWMAP\n"; if (key.UseLevelMesh) definesBlock << "#define USE_LEVELMESH\n"; diff --git a/src/common/rendering/vulkan/shaders/vk_shader.h b/src/common/rendering/vulkan/shaders/vk_shader.h index 507f968d5..df8d182a3 100644 --- a/src/common/rendering/vulkan/shaders/vk_shader.h +++ b/src/common/rendering/vulkan/shaders/vk_shader.h @@ -101,7 +101,8 @@ public: uint64_t LightBlendMode : 2; // LIGHT_BLEND_CLAMPED , LIGHT_BLEND_COLORED_CLAMP , LIGHT_BLEND_UNCLAMPED uint64_t LightAttenuationMode : 1; // LIGHT_ATTENUATION_LINEAR , LIGHT_ATTENUATION_INVERSE_SQUARE uint64_t UseRaytracePrecise : 1; // USE_RAYTRACE_PRECISE - uint64_t Unused : 36; + uint64_t ShadowmapFilter : 4; // SHADOWMAP_FILTER + uint64_t Unused : 32; }; uint64_t AsQWORD = 0; }; diff --git a/src/common/rendering/vulkan/vk_renderstate.cpp b/src/common/rendering/vulkan/vk_renderstate.cpp index 9ff7d69f7..fca1758aa 100644 --- a/src/common/rendering/vulkan/vk_renderstate.cpp +++ b/src/common/rendering/vulkan/vk_renderstate.cpp @@ -305,6 +305,7 @@ void VkRenderState::ApplyRenderPass(int dt) pipelineKey.ShaderKey.UseShadowmap = gl_light_shadows == 1; pipelineKey.ShaderKey.UseRaytrace = gl_light_shadows >= 2; pipelineKey.ShaderKey.UseRaytracePrecise = gl_light_shadows >= 3; + pipelineKey.ShaderKey.ShadowmapFilter = std::clamp(int(gl_light_shadow_filter), 0, 15); pipelineKey.ShaderKey.GBufferPass = mRenderTarget.DrawBuffers > 1; @@ -1069,6 +1070,8 @@ void VkRenderState::ApplyLevelMeshPipeline(VulkanCommandBuffer* cmdbuffer, VkPip pipelineKey.ShaderKey.UseShadowmap = gl_light_shadows == 1; pipelineKey.ShaderKey.UseRaytrace = gl_light_shadows >= 2; pipelineKey.ShaderKey.UseRaytracePrecise = gl_light_shadows >= 3; + pipelineKey.ShaderKey.ShadowmapFilter = std::clamp(int(gl_light_shadow_filter), 0, 15); + pipelineKey.ShaderKey.GBufferPass = mRenderTarget.DrawBuffers > 1; // State overridden by the renderstate drawing the mesh diff --git a/src/rendering/hwrenderer/scene/hw_drawinfo.cpp b/src/rendering/hwrenderer/scene/hw_drawinfo.cpp index 2f2d77e0d..0aadab029 100644 --- a/src/rendering/hwrenderer/scene/hw_drawinfo.cpp +++ b/src/rendering/hwrenderer/scene/hw_drawinfo.cpp @@ -128,7 +128,6 @@ void HWDrawInfo::StartScene(FRenderViewpoint &parentvp, HWViewpointUniforms *uni VPUniforms.mPalLightLevels = static_cast(gl_bandedswlight) | (static_cast(gl_fogmode) << 8) | ((int)lightmode << 16); } VPUniforms.mClipLine.X = -10000000.0f; - VPUniforms.mShadowFilter = static_cast(gl_light_shadow_filter); } mClipper->SetViewpoint(Viewpoint); vClipper->SetViewpoint(Viewpoint); diff --git a/wadsrc/static/shaders/scene/binding_rsbuffers.glsl b/wadsrc/static/shaders/scene/binding_rsbuffers.glsl index 47039f724..63fd5a7bb 100644 --- a/wadsrc/static/shaders/scene/binding_rsbuffers.glsl +++ b/wadsrc/static/shaders/scene/binding_rsbuffers.glsl @@ -16,7 +16,6 @@ layout(set = 1, binding = 0, std140) uniform readonly ViewpointUBO int uViewHeight; // Software fuzz scaling float uClipHeight; float uClipHeightDirection; - int uShadowmapFilter; int uLightTilesWidth; // Levelmesh light tiles }; diff --git a/wadsrc/static/shaders/scene/light_shadow.glsl b/wadsrc/static/shaders/scene/light_shadow.glsl index c9db2fc05..a0b54a922 100644 --- a/wadsrc/static/shaders/scene/light_shadow.glsl +++ b/wadsrc/static/shaders/scene/light_shadow.glsl @@ -48,7 +48,7 @@ float traceHit(vec3 origin, vec3 direction, float dist) #endif } -float traceShadow(vec4 lightpos, int quality, float softShadowRadius) +float traceShadow(vec4 lightpos, float softShadowRadius) { vec3 origin = pixelpos.xyz + vWorldNormal.xyz; vec3 target = lightpos.xyz + 0.01; // nudge light position slightly as Doom maps tend to have their lights perfectly aligned with planes @@ -56,7 +56,10 @@ float traceShadow(vec4 lightpos, int quality, float softShadowRadius) vec3 direction = normalize(target - origin); float dist = distance(origin, target); - if (quality == 0 || softShadowRadius == 0) +#if SHADOWMAP_FILTER == 0 + return traceHit(origin, direction, dist); +#else + if (softShadowRadius == 0) { return traceHit(origin, direction, dist); } @@ -67,7 +70,7 @@ float traceShadow(vec4 lightpos, int quality, float softShadowRadius) vec3 ydir = cross(direction, xdir); float sum = 0.0; - int step_count = quality * 4; + const int step_count = SHADOWMAP_FILTER * 4; for (int i = 0; i < step_count; i++) { vec2 gridoffset = getVogelDiskSample(i, step_count, gl_FragCoord.x + gl_FragCoord.y * 13.37) * softShadowRadius; @@ -76,13 +79,14 @@ float traceShadow(vec4 lightpos, int quality, float softShadowRadius) } return (sum / step_count); } +#endif } float shadowAttenuation(vec4 lightpos, float lightcolorA, float softShadowRadius) { if (lightpos.w > 1000000.0) return 1.0; // Sunlight - return traceShadow(lightpos, uShadowmapFilter, softShadowRadius); + return traceShadow(lightpos, softShadowRadius); } #elif defined(USE_SHADOWMAP) @@ -172,7 +176,7 @@ float sampleShadowmapPCF(vec3 planePoint, float v) float texelPos = floor(shadowDirToU(ray.xz) * scale); float sum = 0.0; - float step_count = uShadowmapFilter; + float step_count = SHADOWMAP_FILTER; texelPos -= step_count + 0.5; for (float x = -step_count; x <= step_count; x++) @@ -189,7 +193,7 @@ float sampleShadowmapPCF(vec3 planePoint, float v) sum += step(dist2, texture(ShadowMap, vec2(u, v)).x); texelPos++; } - return sum / (uShadowmapFilter * 2.0 + 1.0); + return sum / (SHADOWMAP_FILTER * 2.0 + 1.0); } float shadowmapAttenuation(vec4 lightpos, float shadowIndex) @@ -201,15 +205,12 @@ float shadowmapAttenuation(vec4 lightpos, float shadowIndex) return 1.0; // Light is too close float v = (shadowIndex + 0.5) / 1024.0; - - if (uShadowmapFilter == 0) - { + + #if SHADOWMAP_FILTER == 0 return sampleShadowmap(planePoint, v); - } - else - { + #else return sampleShadowmapPCF(planePoint, v); - } + #endif } float shadowAttenuation(vec4 lightpos, float lightcolorA, float softShadowRadius)