diff --git a/src/common/rendering/hwrenderer/data/hw_renderstate.h b/src/common/rendering/hwrenderer/data/hw_renderstate.h index 18f138682..a6804d0e4 100644 --- a/src/common/rendering/hwrenderer/data/hw_renderstate.h +++ b/src/common/rendering/hwrenderer/data/hw_renderstate.h @@ -193,6 +193,7 @@ public: mSurfaceUniforms.uLightFactor = 0.0f; mSurfaceUniforms.uFogDensity = 0.0f; mSurfaceUniforms.uLightLevel = -1.0f; + mSurfaceUniforms.uDepthFadeFalloff = 0.0f; mSpecialEffect = EFF_NONE; mLightIndex = -1; mBoneIndexBase = -1; @@ -263,6 +264,11 @@ public: mSurfaceUniforms.uDesaturationFactor = 0.0f; } + void SetDepthFadeFalloff(float falloff) + { + mSurfaceUniforms.uDepthFadeFalloff = falloff; + } + void SetTextureClamp(bool on) { if (on) mTextureClamp = TM_CLAMPY; diff --git a/src/common/rendering/hwrenderer/data/hw_surfaceuniforms.h b/src/common/rendering/hwrenderer/data/hw_surfaceuniforms.h index 5705c9a8d..a56f953c6 100644 --- a/src/common/rendering/hwrenderer/data/hw_surfaceuniforms.h +++ b/src/common/rendering/hwrenderer/data/hw_surfaceuniforms.h @@ -44,6 +44,6 @@ struct SurfaceUniforms float uAlphaThreshold; int uTextureIndex; - float padding2; + float uDepthFadeFalloff; float padding3; }; diff --git a/src/common/rendering/vulkan/shaders/vk_shader.cpp b/src/common/rendering/vulkan/shaders/vk_shader.cpp index b73d9ba8c..f7f84f892 100644 --- a/src/common/rendering/vulkan/shaders/vk_shader.cpp +++ b/src/common/rendering/vulkan/shaders/vk_shader.cpp @@ -185,6 +185,8 @@ std::unique_ptr VkShaderManager::LoadFragShader(FString shadername if (!key.AlphaTest) definesBlock << "#define NO_ALPHATEST\n"; if (key.GBufferPass) definesBlock << "#define GBUFFER_PASS\n"; + if (key.DepthFadeFalloff) definesBlock << "#define USE_DEPTHFADEFALLOFF\n"; + if (key.Simple2D) definesBlock << "#define SIMPLE2D\n"; if (key.ClampY) definesBlock << "#define TEXF_ClampY\n"; if (key.Brightmap) definesBlock << "#define TEXF_Brightmap\n"; diff --git a/src/common/rendering/vulkan/shaders/vk_shader.h b/src/common/rendering/vulkan/shaders/vk_shader.h index 595a90299..cd68de891 100644 --- a/src/common/rendering/vulkan/shaders/vk_shader.h +++ b/src/common/rendering/vulkan/shaders/vk_shader.h @@ -79,7 +79,8 @@ public: uint64_t UseLevelMesh : 1; // USE_LEVELMESH uint64_t FogBalls : 1; // FOGBALLS uint64_t NoFragmentShader : 1; - uint64_t Unused : 42; + uint64_t DepthFadeFalloff : 1; + uint64_t Unused : 41; }; uint64_t AsQWORD = 0; }; diff --git a/src/common/rendering/vulkan/vk_renderstate.cpp b/src/common/rendering/vulkan/vk_renderstate.cpp index e7836519d..75203782b 100644 --- a/src/common/rendering/vulkan/vk_renderstate.cpp +++ b/src/common/rendering/vulkan/vk_renderstate.cpp @@ -258,6 +258,8 @@ void VkRenderState::ApplyRenderPass(int dt) pipelineKey.ShaderKey.Detailmap = (uTextureMode & TEXF_Detailmap) != 0; pipelineKey.ShaderKey.Glowmap = (uTextureMode & TEXF_Glowmap) != 0; + pipelineKey.ShaderKey.DepthFadeFalloff = mSurfaceUniforms.uDepthFadeFalloff > 0.0f; + // The way GZDoom handles state is just plain insanity! int fogset = 0; if (mFogEnabled) diff --git a/wadsrc/static/shaders/scene/binding_rsbuffers.glsl b/wadsrc/static/shaders/scene/binding_rsbuffers.glsl index 59742e767..5356fb66d 100644 --- a/wadsrc/static/shaders/scene/binding_rsbuffers.glsl +++ b/wadsrc/static/shaders/scene/binding_rsbuffers.glsl @@ -68,7 +68,7 @@ struct SurfaceUniforms float uAlphaThreshold; int uTextureIndex; - float padding2; + float uDepthFadeFalloff; float padding3; }; diff --git a/wadsrc/static/shaders/scene/frag_main.glsl b/wadsrc/static/shaders/scene/frag_main.glsl index f0274aa1a..189658b36 100644 --- a/wadsrc/static/shaders/scene/frag_main.glsl +++ b/wadsrc/static/shaders/scene/frag_main.glsl @@ -27,6 +27,11 @@ void main() if (material.Base.a <= uAlphaThreshold) discard; #endif +#ifdef USE_DEPTHFADEFALLOFF + // To do: add linear depth sampling here + // material.Base.a *= clamp((depth.r - pixelpos.w) / uDepthFadeFalloff, 0.0, 1.0); +#endif + FragColor = ProcessLightMode(material); #ifdef DITHERTRANS diff --git a/wadsrc/static/shaders/scene/layout_shared.glsl b/wadsrc/static/shaders/scene/layout_shared.glsl index 882e11a42..2426f5757 100644 --- a/wadsrc/static/shaders/scene/layout_shared.glsl +++ b/wadsrc/static/shaders/scene/layout_shared.glsl @@ -69,6 +69,7 @@ layout(push_constant) uniform PushConstants #define uLightDist data[uDataIndex].uLightDist #define uAlphaThreshold data[uDataIndex].uAlphaThreshold #define uTextureIndex data[uDataIndex].uTextureIndex +#define uDepthFadeFalloff data[uDataIndex].uDepthFadeFalloff #define VULKAN_COORDINATE_SYSTEM #define HAS_UNIFORM_VERTEX_DATA