diff --git a/src/common/rendering/vulkan/renderer/vk_renderstate.cpp b/src/common/rendering/vulkan/renderer/vk_renderstate.cpp index c912e4ddea..59440f3419 100644 --- a/src/common/rendering/vulkan/renderer/vk_renderstate.cpp +++ b/src/common/rendering/vulkan/renderer/vk_renderstate.cpp @@ -255,6 +255,8 @@ void VkRenderState::ApplyRenderPass(int dt) pipelineKey.ShaderKey.Detailmap = (uTextureMode & TEXF_Detailmap) != 0; pipelineKey.ShaderKey.Glowmap = (uTextureMode & TEXF_Glowmap) != 0; pipelineKey.ShaderKey.Simple2D = (mFogEnabled == 2); + pipelineKey.ShaderKey.UseShadowmap = gl_light_shadowmap; + pipelineKey.ShaderKey.UseRaytrace = gl_light_raytrace; // Is this the one we already have? bool inRenderPass = mCommandBuffer; diff --git a/src/common/rendering/vulkan/shaders/vk_shader.cpp b/src/common/rendering/vulkan/shaders/vk_shader.cpp index 4335e08dac..1886a84aff 100644 --- a/src/common/rendering/vulkan/shaders/vk_shader.cpp +++ b/src/common/rendering/vulkan/shaders/vk_shader.cpp @@ -166,8 +166,7 @@ std::unique_ptr VkShaderManager::LoadVertShader(FString shadername std::unique_ptr VkShaderManager::LoadFragShader(FString shadername, const char *frag_lump, const char *material_lump, const char* mateffect_lump, const char *light_lump, const char *defines, const VkShaderKey& key) { FString definesBlock; - definesBlock << defines << "\n"; - if (fb->device->SupportsExtension(VK_KHR_RAY_QUERY_EXTENSION_NAME)) definesBlock << "\n#define SUPPORTS_RAYTRACING\n"; + if (fb->device->SupportsExtension(VK_KHR_RAY_QUERY_EXTENSION_NAME)) definesBlock << "\n#define SUPPORTS_RAYQUERY\n"; definesBlock << defines; definesBlock << "\n#define MAX_STREAM_DATA " << std::to_string(MAX_STREAM_DATA).c_str() << "\n"; #ifdef NPOT_EMULATION @@ -183,6 +182,9 @@ std::unique_ptr VkShaderManager::LoadFragShader(FString shadername if (key.Detailmap) definesBlock << "#define TEXF_Detailmap\n"; if (key.Glowmap) definesBlock << "#define TEXF_Glowmap\n"; + if (key.UseRaytrace) definesBlock << "\n#define USE_RAYTRACE\n"; + if (key.UseShadowmap) definesBlock << "\n#define USE_SHADOWMAP\n"; + switch (key.TextureMode) { case TM_STENCIL: definesBlock << "#define TM_STENCIL\n"; break; diff --git a/src/common/rendering/vulkan/shaders/vk_shader.h b/src/common/rendering/vulkan/shaders/vk_shader.h index 95dee53acb..ceaec62aba 100644 --- a/src/common/rendering/vulkan/shaders/vk_shader.h +++ b/src/common/rendering/vulkan/shaders/vk_shader.h @@ -74,7 +74,9 @@ public: uint64_t Detailmap : 1; // uTextureMode & TEXF_Detailmap uint64_t Glowmap : 1; // uTextureMode & TEXF_Glowmap uint64_t GBufferPass : 1; // GBUFFER_PASS - uint64_t Unused : 54; + uint64_t UseShadowmap : 1; // USE_SHADOWMAPS + uint64_t UseRaytrace : 1; // USE_RAYTRACE + uint64_t Unused : 52; }; uint64_t AsQWORD = 0; }; diff --git a/src/rendering/hwrenderer/scene/hw_drawinfo.cpp b/src/rendering/hwrenderer/scene/hw_drawinfo.cpp index 0101efa226..1e1802ba02 100644 --- a/src/rendering/hwrenderer/scene/hw_drawinfo.cpp +++ b/src/rendering/hwrenderer/scene/hw_drawinfo.cpp @@ -165,7 +165,7 @@ 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.mShadowmapFilter = gl_light_raytrace ? -1 - static_cast(gl_shadowmap_filter) : static_cast(gl_shadowmap_filter); + VPUniforms.mShadowmapFilter = static_cast(gl_shadowmap_filter); VPUniforms.mLightBlendMode = (level.info ? (int)level.info->lightblendmode : 0); } mClipper->SetViewpoint(Viewpoint); diff --git a/wadsrc/static/shaders/scene/layout_shared.glsl b/wadsrc/static/shaders/scene/layout_shared.glsl index 714a2aa133..15ddbfc899 100644 --- a/wadsrc/static/shaders/scene/layout_shared.glsl +++ b/wadsrc/static/shaders/scene/layout_shared.glsl @@ -1,7 +1,7 @@ layout(set = 0, binding = 0) uniform sampler2D ShadowMap; layout(set = 0, binding = 1) uniform sampler2DArray LightMap; -#ifdef SUPPORTS_RAYTRACING +#if defined(USE_RAYTRACE) && defined(SUPPORTS_RAYQUERY) layout(set = 0, binding = 2) uniform accelerationStructureEXT TopLevelAS; #endif @@ -169,7 +169,6 @@ layout(push_constant) uniform PushConstants #define uDetailParms data[uDataIndex].uDetailParms #define uNpotEmulation data[uDataIndex].uNpotEmulation -#define SUPPORTS_SHADOWMAPS #define VULKAN_COORDINATE_SYSTEM #define HAS_UNIFORM_VERTEX_DATA diff --git a/wadsrc/static/shaders/scene/light_shadow.glsl b/wadsrc/static/shaders/scene/light_shadow.glsl index 398a0955d8..ee59998328 100644 --- a/wadsrc/static/shaders/scene/light_shadow.glsl +++ b/wadsrc/static/shaders/scene/light_shadow.glsl @@ -1,7 +1,7 @@ // Check if light is in shadow -#ifdef SUPPORTS_RAYTRACING +#if defined(USE_RAYTRACE) && defined(SUPPORTS_RAYQUERY) bool traceHit(vec3 origin, vec3 direction, float dist) { @@ -72,16 +72,12 @@ float traceShadow(vec4 lightpos, int quality) } } -#else - -float traceShadow(vec4 lightpos, int quality) +float shadowAttenuation(vec4 lightpos, float lightcolorA) { - return 1.0; + return traceShadow(lightpos, uShadowmapFilter); } -#endif - -#ifdef SUPPORTS_SHADOWMAPS +#elif defined(USE_SHADOWMAP) float shadowDirToU(vec2 dir) { @@ -214,9 +210,6 @@ float shadowAttenuation(vec4 lightpos, float lightcolorA) if (shadowIndex >= 1024.0) return 1.0; // No shadowmap available for this light - if (uShadowmapFilter < 0) - return traceShadow(lightpos, 1 - uShadowmapFilter); - return shadowmapAttenuation(lightpos, shadowIndex); }