From f11318ff99bb5f8cc3f5996e413c16ef37cdc105 Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Thu, 6 Apr 2023 19:36:58 +0200 Subject: [PATCH] Fix misc shader related issues --- .../hwrenderer/data/hw_shaderpatcher.cpp | 40 ---------- .../hwrenderer/data/hw_shaderpatcher.h | 23 ------ src/common/rendering/v_video.h | 1 - .../vulkan/renderer/vk_renderstate.cpp | 13 +-- .../rendering/vulkan/shaders/vk_shader.cpp | 79 +++++++++++++++++-- .../rendering/vulkan/shaders/vk_shader.h | 2 +- wadsrc/static/shaders/scene/frag_2d.glsl | 25 ------ .../static/shaders/scene/frag_2d_stencil.glsl | 27 ------- wadsrc/static/shaders/scene/frag_main.glsl | 54 +++++++++++++ wadsrc/static/shaders/scene/frag_surface.glsl | 22 ------ .../shaders/scene/frag_surface_stencil.glsl | 39 --------- wadsrc/static/shaders/scene/includes.glsl | 4 + wadsrc/static/shaders/scene/layout_frag.glsl | 5 +- .../static/shaders/scene/layout_shared.glsl | 2 +- wadsrc/static/shaders/scene/material.glsl | 16 ++-- .../shaders/scene/material_gettexel.glsl | 16 ++-- 16 files changed, 159 insertions(+), 209 deletions(-) delete mode 100644 wadsrc/static/shaders/scene/frag_2d.glsl delete mode 100644 wadsrc/static/shaders/scene/frag_2d_stencil.glsl create mode 100644 wadsrc/static/shaders/scene/frag_main.glsl delete mode 100644 wadsrc/static/shaders/scene/frag_surface.glsl delete mode 100644 wadsrc/static/shaders/scene/frag_surface_stencil.glsl diff --git a/src/common/rendering/hwrenderer/data/hw_shaderpatcher.cpp b/src/common/rendering/hwrenderer/data/hw_shaderpatcher.cpp index 342c343b04..fc66d63def 100644 --- a/src/common/rendering/hwrenderer/data/hw_shaderpatcher.cpp +++ b/src/common/rendering/hwrenderer/data/hw_shaderpatcher.cpp @@ -269,43 +269,3 @@ FString RemoveLayoutLocationDecl(FString code, const char *inoutkeyword) return code; } - -///////////////////////////////////////////////////////////////////////////// - -// Note: the MaterialShaderIndex enum in gl_shader.h needs to be updated whenever this array is modified. -const FDefaultShader defaultshaders[] = -{ - {"Default", "shaders/scene/material_default.glsl", "shaders/scene/mateffect_default.glsl", "shaders/scene/lightmodel_normal.glsl", ""}, - {"Warp 1", "shaders/scene/material_default.glsl", "shaders/scene/mateffect_warp1.glsl", "shaders/scene/lightmodel_normal.glsl", ""}, - {"Warp 2", "shaders/scene/material_default.glsl", "shaders/scene/mateffect_warp2.glsl", "shaders/scene/lightmodel_normal.glsl", ""}, - {"Specular", "shaders/scene/material_spec.glsl", "shaders/scene/mateffect_default.glsl", "shaders/scene/lightmodel_specular.glsl", "#define SPECULAR\n#define NORMALMAP\n"}, - {"PBR", "shaders/scene/material_pbr.glsl", "shaders/scene/mateffect_default.glsl", "shaders/scene/lightmodel_pbr.glsl", "#define PBR\n#define NORMALMAP\n"}, - {"Paletted", "shaders/scene/material_paletted.glsl", "shaders/scene/mateffect_default.glsl", "shaders/scene/lightmodel_nolights.glsl", "#define PALETTE_EMULATION\n"}, - {"No Texture", "shaders/scene/material_notexture.glsl", "shaders/scene/mateffect_default.glsl", "shaders/scene/lightmodel_normal.glsl", "#define NO_LAYERS\n"}, - {"Basic Fuzz", "shaders/scene/material_fuzz_standard.glsl", "shaders/scene/mateffect_default.glsl", "shaders/scene/lightmodel_normal.glsl", ""}, - {"Smooth Fuzz", "shaders/scene/material_fuzz_smooth.glsl", "shaders/scene/mateffect_default.glsl", "shaders/scene/lightmodel_normal.glsl", ""}, - {"Swirly Fuzz", "shaders/scene/material_fuzz_swirly.glsl", "shaders/scene/mateffect_default.glsl", "shaders/scene/lightmodel_normal.glsl", ""}, - {"Translucent Fuzz", "shaders/scene/material_fuzz_smoothtranslucent.glsl", "shaders/scene/mateffect_default.glsl", "shaders/scene/lightmodel_normal.glsl", ""}, - {"Jagged Fuzz", "shaders/scene/material_fuzz_jagged.glsl", "shaders/scene/mateffect_default.glsl", "shaders/scene/lightmodel_normal.glsl", ""}, - {"Noise Fuzz", "shaders/scene/material_fuzz_noise.glsl", "shaders/scene/mateffect_default.glsl", "shaders/scene/lightmodel_normal.glsl", ""}, - {"Smooth Noise Fuzz", "shaders/scene/material_fuzz_smoothnoise.glsl", "shaders/scene/mateffect_default.glsl", "shaders/scene/lightmodel_normal.glsl", ""}, - {"Software Fuzz", "shaders/scene/material_fuzz_software.glsl", "shaders/scene/mateffect_default.glsl", "shaders/scene/lightmodel_normal.glsl", ""}, - {nullptr,nullptr,nullptr,nullptr} -}; - -const FEffectShader effectshaders[] = -{ - { "fogboundary", "shaders/scene/frag_fogboundary.glsl", nullptr, nullptr, nullptr, "#define NO_ALPHATEST\n" }, - { "spheremap", "shaders/scene/frag_surface.glsl", "shaders/scene/material_default.glsl", "shaders/scene/mateffect_default.glsl", "shaders/scene/lightmodel_normal.glsl", "#define SPHEREMAP\n#define NO_ALPHATEST\n" }, - { "burn", "shaders/scene/frag_burn.glsl", nullptr, nullptr, nullptr, "#define SIMPLE\n#define NO_ALPHATEST\n" }, - { "stencil", "shaders/scene/frag_stencil.glsl", nullptr, nullptr, nullptr, "#define SIMPLE\n#define NO_ALPHATEST\n" }, -}; - -int DFrameBuffer::GetShaderCount() -{ - int i; - for (i = 0; defaultshaders[i].ShaderName != nullptr; i++); - - return MAX_PASS_TYPES * (countof(defaultshaders) - 1 + usershaders.Size() + MAX_EFFECTS + SHADER_NoTexture); -} - diff --git a/src/common/rendering/hwrenderer/data/hw_shaderpatcher.h b/src/common/rendering/hwrenderer/data/hw_shaderpatcher.h index aeb8f3cdd8..07ad8adcb8 100644 --- a/src/common/rendering/hwrenderer/data/hw_shaderpatcher.h +++ b/src/common/rendering/hwrenderer/data/hw_shaderpatcher.h @@ -7,26 +7,3 @@ FString RemoveLegacyUserUniforms(FString code); FString RemoveSamplerBindings(FString code, TArray> &samplerstobind); // For GL 3.3 compatibility which cannot declare sampler bindings in the sampler source. FString RemoveLayoutLocationDecl(FString code, const char *inoutkeyword); - -struct FDefaultShader -{ - const char * ShaderName; - const char * material_lump; - const char * mateffect_lump; - const char * lightmodel_lump; - const char * Defines; -}; - -struct FEffectShader -{ - const char *ShaderName; - const char *fp1; - const char *fp2; - const char *fp3; - const char *fp4; - const char *defines; -}; - -extern const FDefaultShader defaultshaders[]; -extern const FEffectShader effectshaders[]; - diff --git a/src/common/rendering/v_video.h b/src/common/rendering/v_video.h index e98f64f985..7cd143c815 100644 --- a/src/common/rendering/v_video.h +++ b/src/common/rendering/v_video.h @@ -163,7 +163,6 @@ public: virtual void InitializeState() = 0; // For stuff that needs 'screen' set. virtual bool IsVulkan() { return false; } virtual bool IsPoly() { return false; } - virtual int GetShaderCount(); virtual bool CompileNextShader() { return true; } void SetAABBTree(hwrenderer::LevelAABBTree * tree) { diff --git a/src/common/rendering/vulkan/renderer/vk_renderstate.cpp b/src/common/rendering/vulkan/renderer/vk_renderstate.cpp index 21b9e7ab44..c912e4ddea 100644 --- a/src/common/rendering/vulkan/renderer/vk_renderstate.cpp +++ b/src/common/rendering/vulkan/renderer/vk_renderstate.cpp @@ -248,6 +248,14 @@ void VkRenderState::ApplyRenderPass(int dt) pipelineKey.ShaderKey.AlphaTest = mAlphaThreshold >= 0.f; } + int uTextureMode = GetTextureModeAndFlags((mMaterial.mMaterial && mMaterial.mMaterial->Source()->isHardwareCanvas()) ? TM_OPAQUE : TM_NORMAL); + pipelineKey.ShaderKey.TextureMode = uTextureMode & 0xffff; + pipelineKey.ShaderKey.ClampY = (uTextureMode & TEXF_ClampY) != 0; + pipelineKey.ShaderKey.Brightmap = (uTextureMode & TEXF_Brightmap) != 0; + pipelineKey.ShaderKey.Detailmap = (uTextureMode & TEXF_Detailmap) != 0; + pipelineKey.ShaderKey.Glowmap = (uTextureMode & TEXF_Glowmap) != 0; + pipelineKey.ShaderKey.Simple2D = (mFogEnabled == 2); + // Is this the one we already have? bool inRenderPass = mCommandBuffer; bool changingPipeline = (!inRenderPass) || (pipelineKey != mPipelineKey); @@ -371,12 +379,7 @@ void VkRenderState::ApplyPushConstants() } } - int tempTM = TM_NORMAL; - if (mMaterial.mMaterial && mMaterial.mMaterial->Source()->isHardwareCanvas()) - tempTM = TM_OPAQUE; - mPushConstants.uFogEnabled = fogset; - mPushConstants.uTextureMode = GetTextureModeAndFlags(tempTM); mPushConstants.uLightDist = mLightParms[0]; mPushConstants.uLightFactor = mLightParms[1]; mPushConstants.uFogDensity = mLightParms[2]; diff --git a/src/common/rendering/vulkan/shaders/vk_shader.cpp b/src/common/rendering/vulkan/shaders/vk_shader.cpp index 8a06831704..e9da5b983c 100644 --- a/src/common/rendering/vulkan/shaders/vk_shader.cpp +++ b/src/common/rendering/vulkan/shaders/vk_shader.cpp @@ -53,21 +53,69 @@ VkShaderProgram* VkShaderManager::Get(const VkShaderKey& k, EPassType passType) if (!program.frag) { const char* mainvp = "shaders/scene/vert_main.glsl"; - const char* mainfp = "shaders/scene/frag_surface.glsl"; + const char* mainfp = "shaders/scene/frag_main.glsl"; if (key.SpecialEffect != EFF_NONE) { + struct FEffectShader + { + const char* ShaderName; + const char* fp1; + const char* fp2; + const char* fp3; + const char* fp4; + const char* defines; + }; + + static const FEffectShader effectshaders[] = + { + { "fogboundary", "shaders/scene/frag_fogboundary.glsl", nullptr, nullptr, nullptr, "#define NO_ALPHATEST\n" }, + { "spheremap", "shaders/scene/frag_main.glsl", "shaders/scene/material_default.glsl", "shaders/scene/mateffect_default.glsl", "shaders/scene/lightmodel_normal.glsl", "#define SPHEREMAP\n#define NO_ALPHATEST\n" }, + { "burn", "shaders/scene/frag_burn.glsl", nullptr, nullptr, nullptr, "#define SIMPLE\n#define NO_ALPHATEST\n" }, + { "stencil", "shaders/scene/frag_stencil.glsl", nullptr, nullptr, nullptr, "#define SIMPLE\n#define NO_ALPHATEST\n" }, + }; + const auto& desc = effectshaders[key.SpecialEffect]; program.vert = LoadVertShader(desc.ShaderName, mainvp, desc.defines); - program.frag = LoadFragShader(desc.ShaderName, desc.fp1, desc.fp2, desc.fp3, desc.fp4, desc.defines, true, key.GBufferPass); + program.frag = LoadFragShader(desc.ShaderName, desc.fp1, desc.fp2, desc.fp3, desc.fp4, desc.defines, key); } else { + struct FDefaultShader + { + const char* ShaderName; + const char* material_lump; + const char* mateffect_lump; + const char* lightmodel_lump; + const char* Defines; + }; + + // Note: the MaterialShaderIndex enum needs to be updated whenever this array is modified. + static const FDefaultShader defaultshaders[] = + { + {"Default", "shaders/scene/material_default.glsl", "shaders/scene/mateffect_default.glsl", "shaders/scene/lightmodel_normal.glsl", ""}, + {"Warp 1", "shaders/scene/material_default.glsl", "shaders/scene/mateffect_warp1.glsl", "shaders/scene/lightmodel_normal.glsl", ""}, + {"Warp 2", "shaders/scene/material_default.glsl", "shaders/scene/mateffect_warp2.glsl", "shaders/scene/lightmodel_normal.glsl", ""}, + {"Specular", "shaders/scene/material_spec.glsl", "shaders/scene/mateffect_default.glsl", "shaders/scene/lightmodel_specular.glsl", "#define SPECULAR\n#define NORMALMAP\n"}, + {"PBR", "shaders/scene/material_pbr.glsl", "shaders/scene/mateffect_default.glsl", "shaders/scene/lightmodel_pbr.glsl", "#define PBR\n#define NORMALMAP\n"}, + {"Paletted", "shaders/scene/material_paletted.glsl", "shaders/scene/mateffect_default.glsl", "shaders/scene/lightmodel_nolights.glsl", "#define PALETTE_EMULATION\n"}, + {"No Texture", "shaders/scene/material_notexture.glsl", "shaders/scene/mateffect_default.glsl", "shaders/scene/lightmodel_normal.glsl", "#define NO_LAYERS\n"}, + {"Basic Fuzz", "shaders/scene/material_fuzz_standard.glsl", "shaders/scene/mateffect_default.glsl", "shaders/scene/lightmodel_normal.glsl", ""}, + {"Smooth Fuzz", "shaders/scene/material_fuzz_smooth.glsl", "shaders/scene/mateffect_default.glsl", "shaders/scene/lightmodel_normal.glsl", ""}, + {"Swirly Fuzz", "shaders/scene/material_fuzz_swirly.glsl", "shaders/scene/mateffect_default.glsl", "shaders/scene/lightmodel_normal.glsl", ""}, + {"Translucent Fuzz", "shaders/scene/material_fuzz_smoothtranslucent.glsl", "shaders/scene/mateffect_default.glsl", "shaders/scene/lightmodel_normal.glsl", ""}, + {"Jagged Fuzz", "shaders/scene/material_fuzz_jagged.glsl", "shaders/scene/mateffect_default.glsl", "shaders/scene/lightmodel_normal.glsl", ""}, + {"Noise Fuzz", "shaders/scene/material_fuzz_noise.glsl", "shaders/scene/mateffect_default.glsl", "shaders/scene/lightmodel_normal.glsl", ""}, + {"Smooth Noise Fuzz", "shaders/scene/material_fuzz_smoothnoise.glsl", "shaders/scene/mateffect_default.glsl", "shaders/scene/lightmodel_normal.glsl", ""}, + {"Software Fuzz", "shaders/scene/material_fuzz_software.glsl", "shaders/scene/mateffect_default.glsl", "shaders/scene/lightmodel_normal.glsl", ""}, + {nullptr,nullptr,nullptr,nullptr} + }; + if (key.EffectState < FIRST_USER_SHADER) { const auto& desc = defaultshaders[key.EffectState]; program.vert = LoadVertShader(desc.ShaderName, mainvp, desc.Defines); - program.frag = LoadFragShader(desc.ShaderName, mainfp, desc.material_lump, desc.mateffect_lump, desc.lightmodel_lump, desc.Defines, key.AlphaTest, key.GBufferPass); + program.frag = LoadFragShader(desc.ShaderName, mainfp, desc.material_lump, desc.mateffect_lump, desc.lightmodel_lump, desc.Defines, key); } else { @@ -76,7 +124,7 @@ VkShaderProgram* VkShaderManager::Get(const VkShaderKey& k, EPassType passType) FString defines = defaultshaders[desc.shaderType].Defines + desc.defines; program.vert = LoadVertShader(name, mainvp, defines); - program.frag = LoadFragShader(name, mainfp, desc.shader, defaultshaders[desc.shaderType].mateffect_lump, defaultshaders[desc.shaderType].lightmodel_lump, defines, key.AlphaTest, key.GBufferPass); + program.frag = LoadFragShader(name, mainfp, desc.shader, defaultshaders[desc.shaderType].mateffect_lump, defaultshaders[desc.shaderType].lightmodel_lump, defines, key); } } } @@ -115,7 +163,7 @@ std::unique_ptr VkShaderManager::LoadVertShader(FString shadername .Create(shadername.GetChars(), fb->device.get()); } -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, bool alphatest, bool gbufferpass) +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"; @@ -126,8 +174,25 @@ std::unique_ptr VkShaderManager::LoadFragShader(FString shadername definesBlock << "#define NPOT_EMULATION\n"; #endif if (!fb->device->EnabledFeatures.Features.shaderClipDistance) definesBlock << "#define NO_CLIPDISTANCE_SUPPORT\n"; - if (!alphatest) definesBlock << "#define NO_ALPHATEST\n"; - if (gbufferpass) definesBlock << "#define GBUFFER_PASS\n"; + if (!key.AlphaTest) definesBlock << "#define NO_ALPHATEST\n"; + if (key.GBufferPass) definesBlock << "#define GBUFFER_PASS\n"; + + if (key.Simple2D) definesBlock << "#define SIMPLE2D\n"; + if (key.ClampY) definesBlock << "#define TEXF_ClampY\n"; + if (key.Brightmap) definesBlock << "#define TEXF_Brightmap\n"; + if (key.Detailmap) definesBlock << "#define TEXF_Detailmap\n"; + if (key.Glowmap) definesBlock << "#define TEXF_Glowmap\n"; + + switch (key.TextureMode) + { + case TM_STENCIL: definesBlock << "#define TM_STENCIL\n"; break; + case TM_OPAQUE: definesBlock << "#define TM_OPAQUE\n"; break; + case TM_INVERSE: definesBlock << "#define TM_INVERSE\n"; break; + case TM_ALPHATEXTURE: definesBlock << "#define TM_ALPHATEXTURE\n"; break; + case TM_CLAMPY: definesBlock << "#define TM_CLAMPY\n"; break; + case TM_INVERTOPAQUE: definesBlock << "#define TM_INVERTOPAQUE\n"; break; + case TM_FOGLAYER: definesBlock << "#define TM_FOGLAYER\n"; break; + } FString layoutBlock; layoutBlock << LoadPrivateShaderLump("shaders/scene/layout_shared.glsl").GetChars() << "\n"; diff --git a/src/common/rendering/vulkan/shaders/vk_shader.h b/src/common/rendering/vulkan/shaders/vk_shader.h index 067eb28ca8..95dee53acb 100644 --- a/src/common/rendering/vulkan/shaders/vk_shader.h +++ b/src/common/rendering/vulkan/shaders/vk_shader.h @@ -115,7 +115,7 @@ public: private: std::unique_ptr LoadVertShader(FString shadername, const char *vert_lump, const char *defines); - std::unique_ptr LoadFragShader(FString shadername, const char *frag_lump, const char *material_lump, const char* mateffect_lump, const char *lightmodel_lump, const char *defines, bool alphatest, bool gbufferpass); + std::unique_ptr LoadFragShader(FString shadername, const char *frag_lump, const char *material_lump, const char* mateffect_lump, const char *lightmodel_lump, const char *defines, const VkShaderKey& key); ShaderIncludeResult OnInclude(FString headerName, FString includerName, size_t depth, bool system); diff --git a/wadsrc/static/shaders/scene/frag_2d.glsl b/wadsrc/static/shaders/scene/frag_2d.glsl deleted file mode 100644 index 8eff32483d..0000000000 --- a/wadsrc/static/shaders/scene/frag_2d.glsl +++ /dev/null @@ -1,25 +0,0 @@ - -void main() -{ -#ifdef NO_CLIPDISTANCE_SUPPORT - if (ClipDistanceA.x < 0 || ClipDistanceA.y < 0 || ClipDistanceA.z < 0 || ClipDistanceA.w < 0 || ClipDistanceB.x < 0) discard; -#endif - - Material material = CreateMaterial(); - vec4 frag = material.Base; - -#ifndef NO_ALPHATEST - if (frag.a <= uAlphaThreshold) discard; -#endif - - // simple 2D (uses the fog color to add a color overlay) - - frag = frag * ProcessLight(material, vColor); - frag.rgb = frag.rgb + uFogColor.rgb; - - FragColor = frag; -#ifdef GBUFFER_PASS - FragFog = vec4(AmbientOcclusionColor(), 1.0); - FragNormal = vec4(vEyeNormal.xyz * 0.5 + 0.5, 1.0); -#endif -} diff --git a/wadsrc/static/shaders/scene/frag_2d_stencil.glsl b/wadsrc/static/shaders/scene/frag_2d_stencil.glsl deleted file mode 100644 index 4cfcdccb2f..0000000000 --- a/wadsrc/static/shaders/scene/frag_2d_stencil.glsl +++ /dev/null @@ -1,27 +0,0 @@ - -void main() -{ -#ifdef NO_CLIPDISTANCE_SUPPORT - if (ClipDistanceA.x < 0 || ClipDistanceA.y < 0 || ClipDistanceA.z < 0 || ClipDistanceA.w < 0 || ClipDistanceB.x < 0) discard; -#endif - - Material material = CreateMaterial(); - vec4 frag = material.Base; - -#ifndef NO_ALPHATEST - if (frag.a <= uAlphaThreshold) discard; -#endif - - float gray = grayscale(frag); - vec4 cm = (uObjectColor + gray * (uAddColor - uObjectColor)) * 2; - frag = vec4(clamp(cm.rgb, 0.0, 1.0), frag.a); - - frag = frag * ProcessLight(material, vColor); - frag.rgb = frag.rgb + uFogColor.rgb; - - FragColor = frag; -#ifdef GBUFFER_PASS - FragFog = vec4(AmbientOcclusionColor(), 1.0); - FragNormal = vec4(vEyeNormal.xyz * 0.5 + 0.5, 1.0); -#endif -} diff --git a/wadsrc/static/shaders/scene/frag_main.glsl b/wadsrc/static/shaders/scene/frag_main.glsl new file mode 100644 index 0000000000..03c04261d4 --- /dev/null +++ b/wadsrc/static/shaders/scene/frag_main.glsl @@ -0,0 +1,54 @@ + +void main() +{ +#ifdef NO_CLIPDISTANCE_SUPPORT + if (ClipDistanceA.x < 0 || ClipDistanceA.y < 0 || ClipDistanceA.z < 0 || ClipDistanceA.w < 0 || ClipDistanceB.x < 0) discard; +#endif + + Material material = CreateMaterial(); + vec4 frag = material.Base; + +#ifndef NO_ALPHATEST + if (frag.a <= uAlphaThreshold) discard; +#endif + +#ifdef SIMPLE2D // uses the fog color to add a color overlay + #ifdef TM_FOGLAYER + float gray = grayscale(frag); + vec4 cm = (uObjectColor + gray * (uAddColor - uObjectColor)) * 2; + frag = vec4(clamp(cm.rgb, 0.0, 1.0), frag.a); + frag.rgb = frag.rgb + uFogColor.rgb; + #else + frag.rgb = frag.rgb + uFogColor.rgb; + #endif +#else + #ifdef TM_FOGLAYER + float fogdist = 0.0; + float fogfactor = 0.0; + + // calculate fog factor + if (uFogEnabled != 0) + { + if (uFogEnabled == 1 || uFogEnabled == -1) + { + fogdist = max(16.0, pixelpos.w); + } + else + { + fogdist = max(16.0, distance(pixelpos.xyz, uCameraPos.xyz)); + } + fogfactor = exp2 (uFogDensity * fogdist); + } + + frag = vec4(uFogColor.rgb, (1.0 - fogfactor) * frag.a * 0.75 * vColor.a); + #else + frag = getLightColor(material); + #endif +#endif + + FragColor = frag; +#ifdef GBUFFER_PASS + FragFog = vec4(AmbientOcclusionColor(), 1.0); + FragNormal = vec4(vEyeNormal.xyz * 0.5 + 0.5, 1.0); +#endif +} diff --git a/wadsrc/static/shaders/scene/frag_surface.glsl b/wadsrc/static/shaders/scene/frag_surface.glsl deleted file mode 100644 index 78a56bc9cf..0000000000 --- a/wadsrc/static/shaders/scene/frag_surface.glsl +++ /dev/null @@ -1,22 +0,0 @@ - -void main() -{ -#ifdef NO_CLIPDISTANCE_SUPPORT - if (ClipDistanceA.x < 0 || ClipDistanceA.y < 0 || ClipDistanceA.z < 0 || ClipDistanceA.w < 0 || ClipDistanceB.x < 0) discard; -#endif - - Material material = CreateMaterial(); - vec4 frag = material.Base; - -#ifndef NO_ALPHATEST - if (frag.a <= uAlphaThreshold) discard; -#endif - - frag = getLightColor(material); - - FragColor = frag; -#ifdef GBUFFER_PASS - FragFog = vec4(AmbientOcclusionColor(), 1.0); - FragNormal = vec4(vEyeNormal.xyz * 0.5 + 0.5, 1.0); -#endif -} diff --git a/wadsrc/static/shaders/scene/frag_surface_stencil.glsl b/wadsrc/static/shaders/scene/frag_surface_stencil.glsl deleted file mode 100644 index 5b531a7780..0000000000 --- a/wadsrc/static/shaders/scene/frag_surface_stencil.glsl +++ /dev/null @@ -1,39 +0,0 @@ - -void main() -{ -#ifdef NO_CLIPDISTANCE_SUPPORT - if (ClipDistanceA.x < 0 || ClipDistanceA.y < 0 || ClipDistanceA.z < 0 || ClipDistanceA.w < 0 || ClipDistanceB.x < 0) discard; -#endif - - Material material = CreateMaterial(); - vec4 frag = material.Base; - -#ifndef NO_ALPHATEST - if (frag.a <= uAlphaThreshold) discard; -#endif - - float fogdist = 0.0; - float fogfactor = 0.0; - - // calculate fog factor - if (uFogEnabled != 0) - { - if (uFogEnabled == 1 || uFogEnabled == -1) - { - fogdist = max(16.0, pixelpos.w); - } - else - { - fogdist = max(16.0, distance(pixelpos.xyz, uCameraPos.xyz)); - } - fogfactor = exp2 (uFogDensity * fogdist); - } - - frag = vec4(uFogColor.rgb, (1.0 - fogfactor) * frag.a * 0.75 * vColor.a); - - FragColor = frag; -#ifdef GBUFFER_PASS - FragFog = vec4(AmbientOcclusionColor(), 1.0); - FragNormal = vec4(vEyeNormal.xyz * 0.5 + 0.5, 1.0); -#endif -} diff --git a/wadsrc/static/shaders/scene/includes.glsl b/wadsrc/static/shaders/scene/includes.glsl index 7bc217ad46..e527b0aeda 100644 --- a/wadsrc/static/shaders/scene/includes.glsl +++ b/wadsrc/static/shaders/scene/includes.glsl @@ -1,5 +1,9 @@ +#ifndef SIMPLE + #include "shaders/scene/material.glsl" #include "shaders/scene/lightmodel.glsl" #include "shaders/scene/light_shadow.glsl" #include "shaders/scene/light_spot.glsl" + +#endif diff --git a/wadsrc/static/shaders/scene/layout_frag.glsl b/wadsrc/static/shaders/scene/layout_frag.glsl index fb671fdd48..f31d00431c 100644 --- a/wadsrc/static/shaders/scene/layout_frag.glsl +++ b/wadsrc/static/shaders/scene/layout_frag.glsl @@ -1,12 +1,15 @@ layout(location = 0) in vec4 vTexCoord; layout(location = 1) in vec4 vColor; +layout(location = 9) in vec3 vLightmap; + +#ifndef SIMPLE layout(location = 2) in vec4 pixelpos; layout(location = 3) in vec3 glowdist; layout(location = 4) in vec3 gradientdist; layout(location = 5) in vec4 vWorldNormal; layout(location = 6) in vec4 vEyeNormal; -layout(location = 9) in vec3 vLightmap; +#endif #ifdef NO_CLIPDISTANCE_SUPPORT layout(location = 7) in vec4 ClipDistanceA; diff --git a/wadsrc/static/shaders/scene/layout_shared.glsl b/wadsrc/static/shaders/scene/layout_shared.glsl index b546a73071..a51340a50a 100644 --- a/wadsrc/static/shaders/scene/layout_shared.glsl +++ b/wadsrc/static/shaders/scene/layout_shared.glsl @@ -100,7 +100,7 @@ layout(set = 2, binding = 11) uniform sampler2D texture12; // This must match the PushConstants struct layout(push_constant) uniform PushConstants { - int uTextureMode; + int padding0; // was uTextureMode; float uAlphaThreshold; vec2 uClipSplit; diff --git a/wadsrc/static/shaders/scene/material.glsl b/wadsrc/static/shaders/scene/material.glsl index c43026dfba..1a94fceee7 100644 --- a/wadsrc/static/shaders/scene/material.glsl +++ b/wadsrc/static/shaders/scene/material.glsl @@ -21,11 +21,6 @@ void SetupMaterial(inout Material mat); vec3 ProcessMaterialLight(Material material, vec3 color); vec2 GetTexCoord(); -// These get Or'ed into uTextureMode because it only uses its 3 lowermost bits. -const int TEXF_Brightmap = 0x10000; -const int TEXF_Detailmap = 0x20000; -const int TEXF_Glowmap = 0x40000; - Material CreateMaterial() { Material material; @@ -58,16 +53,17 @@ void SetMaterialProps(inout Material material, vec2 texCoord) // OpenGL doesn't care, but Vulkan pukes all over the place if these texture samplings are included in no-texture shaders, even though never called. #ifndef NO_LAYERS - if ((uTextureMode & TEXF_Brightmap) != 0) + #if defined(TEXF_Brightmap) material.Bright = desaturate(texture(brighttexture, texCoord.st)); + #endif - if ((uTextureMode & TEXF_Detailmap) != 0) - { + #if defined(TEXF_Detailmap) vec4 Detail = texture(detailtexture, texCoord.st * uDetailParms.xy) * uDetailParms.z; material.Base.rgb *= Detail.rgb; - } + #endif - if ((uTextureMode & TEXF_Glowmap) != 0) + #if defined(TEXF_Glowmap) material.Glow = desaturate(texture(glowtexture, texCoord.st)); + #endif #endif } diff --git a/wadsrc/static/shaders/scene/material_gettexel.glsl b/wadsrc/static/shaders/scene/material_gettexel.glsl index 5b21e6a358..0ac8e21562 100644 --- a/wadsrc/static/shaders/scene/material_gettexel.glsl +++ b/wadsrc/static/shaders/scene/material_gettexel.glsl @@ -10,25 +10,27 @@ vec4 getTexel(vec2 st) vec4 texel = texture(tex, st); // Apply texture modes - #if (uTextureMode & 0xffff) == 1 // TM_STENCIL + #if defined(TM_STENCIL) texel.rgb = vec3(1.0,1.0,1.0); - #elif (uTextureMode & 0xffff) == 2 // TM_OPAQUE + #elif defined(TM_OPAQUE) texel.a = 1.0; - #elif (uTextureMode & 0xffff) == 3 // TM_INVERSE + #elif defined(TM_INVERSE) texel = vec4(1.0-texel.r, 1.0-texel.b, 1.0-texel.g, texel.a); - #elif (uTextureMode & 0xffff) == 3 // TM_ALPHATEXTURE + #elif defined(TM_ALPHATEXTURE) float gray = grayscale(texel); texel = vec4(1.0, 1.0, 1.0, gray*texel.a); - #elif (uTextureMode & 0xffff) == 5 // TM_CLAMPY + #elif defined(TM_CLAMPY) if (st.t < 0.0 || st.t > 1.0) { texel.a = 0.0; } - #elif (uTextureMode & 0xffff) == 6 // TM_OPAQUEINVERSE + #elif defined(TM_INVERTOPAQUE) texel = vec4(1.0-texel.r, 1.0-texel.b, 1.0-texel.g, 1.0); + #elif defined(TM_FOGLAYER) + return texel; #endif - #if (uTextureMode & 0x80000) == 0x80000 // TEXF_ClampY + #if defined(TEXF_ClampY) if (st.t < 0.0 || st.t > 1.0) { texel.a = 0.0;