diff --git a/src/common/rendering/vulkan/shaders/vk_shader.cpp b/src/common/rendering/vulkan/shaders/vk_shader.cpp index d1953591f..998ae7b7e 100644 --- a/src/common/rendering/vulkan/shaders/vk_shader.cpp +++ b/src/common/rendering/vulkan/shaders/vk_shader.cpp @@ -74,7 +74,7 @@ VkShaderProgram* VkShaderManager::Get(const VkShaderKey& key) }; const auto& desc = effectshaders[key.SpecialEffect]; - program.vert = LoadVertShader(desc.ShaderName, mainvp, desc.defines); + program.vert = LoadVertShader(desc.ShaderName, mainvp, desc.defines, key.UseLevelMesh); program.frag = LoadFragShader(desc.ShaderName, desc.fp1, desc.fp2, desc.fp3, desc.fp4, desc.defines, key); } else @@ -112,7 +112,7 @@ VkShaderProgram* VkShaderManager::Get(const VkShaderKey& key) if (key.EffectState < FIRST_USER_SHADER) { const auto& desc = defaultshaders[key.EffectState]; - program.vert = LoadVertShader(desc.ShaderName, mainvp, desc.Defines); + program.vert = LoadVertShader(desc.ShaderName, mainvp, desc.Defines, key.UseLevelMesh); program.frag = LoadFragShader(desc.ShaderName, mainfp, desc.material_lump, desc.mateffect_lump, desc.lightmodel_lump, desc.Defines, key); } else @@ -121,14 +121,14 @@ VkShaderProgram* VkShaderManager::Get(const VkShaderKey& key) const FString& name = ExtractFileBase(desc.shader.GetChars()); FString defines = defaultshaders[desc.shaderType].Defines + desc.defines; - program.vert = LoadVertShader(name, mainvp, defines.GetChars()); + program.vert = LoadVertShader(name, mainvp, defines.GetChars(), key.UseLevelMesh); program.frag = LoadFragShader(name, mainfp, desc.shader.GetChars(), defaultshaders[desc.shaderType].mateffect_lump, defaultshaders[desc.shaderType].lightmodel_lump, defines.GetChars(), key); } } return &program; } -std::unique_ptr VkShaderManager::LoadVertShader(FString shadername, const char *vert_lump, const char *defines) +std::unique_ptr VkShaderManager::LoadVertShader(FString shadername, const char *vert_lump, const char *defines, bool levelmesh) { FString definesBlock; definesBlock << defines; @@ -142,6 +142,9 @@ std::unique_ptr VkShaderManager::LoadVertShader(FString shadername definesBlock << "#define NO_CLIPDISTANCE_SUPPORT\n"; } + if (levelmesh) + definesBlock << "#define USE_LEVELMESH\n"; + FString layoutBlock; layoutBlock << LoadPrivateShaderLump("shaders/scene/layout_shared.glsl").GetChars() << "\n"; layoutBlock << LoadPrivateShaderLump("shaders/scene/layout_vert.glsl").GetChars() << "\n"; diff --git a/src/common/rendering/vulkan/shaders/vk_shader.h b/src/common/rendering/vulkan/shaders/vk_shader.h index ef5a37f4e..2128ed951 100644 --- a/src/common/rendering/vulkan/shaders/vk_shader.h +++ b/src/common/rendering/vulkan/shaders/vk_shader.h @@ -112,7 +112,7 @@ public: void RemoveVkPPShader(VkPPShader* shader); private: - std::unique_ptr LoadVertShader(FString shadername, const char *vert_lump, const char *defines); + std::unique_ptr LoadVertShader(FString shadername, const char *vert_lump, const char *defines, bool levelmesh); 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/src/common/rendering/vulkan/vk_renderdevice.cpp b/src/common/rendering/vulkan/vk_renderdevice.cpp index 17efd5f3f..0fc6b19c5 100644 --- a/src/common/rendering/vulkan/vk_renderdevice.cpp +++ b/src/common/rendering/vulkan/vk_renderdevice.cpp @@ -622,7 +622,7 @@ void VulkanRenderDevice::DrawLevelMesh(const HWViewpointUniforms& viewpoint) auto passSetup = GetRenderPassManager()->GetRenderPass(key); RenderPassBegin beginInfo; - beginInfo.RenderPass(passSetup->GetRenderPass(CT_Depth | CT_Stencil)); + beginInfo.RenderPass(passSetup->GetRenderPass(CT_Color | CT_Depth | CT_Stencil)); beginInfo.RenderArea(0, 0, buffers->GetWidth(), buffers->GetHeight()); beginInfo.Framebuffer(buffers->GetFramebuffer(key)); beginInfo.AddClearColor(screen->mSceneClearColor[0], screen->mSceneClearColor[1], screen->mSceneClearColor[2], screen->mSceneClearColor[3]); @@ -668,9 +668,9 @@ void VulkanRenderDevice::DrawLevelMesh(const HWViewpointUniforms& viewpoint) pipelineKey.DrawType = DT_Triangles; pipelineKey.VertexFormat = vertexFormatIndex; pipelineKey.RenderStyle = DefaultRenderStyle(); - pipelineKey.DepthTest = false; - pipelineKey.DepthWrite = false; - pipelineKey.DepthFunc = 0; + pipelineKey.DepthTest = true; + pipelineKey.DepthWrite = true; + pipelineKey.DepthFunc = DF_Less; pipelineKey.DepthClamp = false; pipelineKey.DepthBias = false; pipelineKey.StencilTest = false; @@ -726,6 +726,8 @@ void VulkanRenderDevice::DrawLevelMesh(const HWViewpointUniforms& viewpoint) #ifdef NPOT_EMULATION streamdata.uNpotEmulation = { 0,0,0,0 }; #endif + streamdata.uClipSplit.X = -1000000.f; + streamdata.uClipSplit.Y = 1000000.f; rsbuffers->StreamBuffer->Write(streamdata); diff --git a/src/rendering/hwrenderer/hw_entrypoint.cpp b/src/rendering/hwrenderer/hw_entrypoint.cpp index c635b6cb0..7999f6722 100644 --- a/src/rendering/hwrenderer/hw_entrypoint.cpp +++ b/src/rendering/hwrenderer/hw_entrypoint.cpp @@ -146,6 +146,8 @@ sector_t* RenderViewpoint(FRenderViewpoint& mainvp, AActor* camera, IntRect* bou vp.SetViewAngle(r_viewwindow); + vp.FieldOfView = DAngle::fromDeg(fov); // Set the real FOV for the current scene (it's not necessarily the same as the global setting in r_viewpoint) + auto lightmode = camera->Level->info->lightmode; if (lightmode == ELightMode::NotSet) lightmode = ELightMode::ZDoomSoftware; @@ -162,7 +164,6 @@ sector_t* RenderViewpoint(FRenderViewpoint& mainvp, AActor* camera, IntRect* bou VPUniforms.mViewMatrix.rotate(vp.HWAngles.Yaw.Degrees(), 0.0f, mult, 0.0f); VPUniforms.mViewMatrix.translate(vp.Pos.X * mult, -vp.Pos.Z * planemult, -vp.Pos.Y); VPUniforms.mViewMatrix.scale(-mult, planemult, 1); - VPUniforms.mNormalViewMatrix.loadIdentity(); VPUniforms.mViewHeight = viewheight; VPUniforms.mGlobVis = (float)R_GetGlobVis(r_viewwindow, r_visibility) / 32.f; VPUniforms.mPalLightLevels = static_cast(gl_bandedswlight) | (static_cast(gl_fogmode) << 8) | ((int)lightmode << 16); @@ -170,17 +171,18 @@ sector_t* RenderViewpoint(FRenderViewpoint& mainvp, AActor* camera, IntRect* bou VPUniforms.mShadowmapFilter = static_cast(gl_shadowmap_filter); VPUniforms.mLightBlendMode = (level.info ? (int)level.info->lightblendmode : 0); VPUniforms.mCameraPos = FVector4(vp.Pos.X, vp.Pos.Z, vp.Pos.Y, 0.0f); + VPUniforms.CalcDependencies(); screen->DrawLevelMesh(VPUniforms); PostProcess.Clock(); //if (toscreen) di->EndDrawScene(mainvp.sector, RenderState); // do not call this for camera textures. - if (RenderState.GetPassType() == GBUFFER_PASS) // Turn off ssao draw buffers + /*if (RenderState.GetPassType() == GBUFFER_PASS) // Turn off ssao draw buffers { RenderState.SetPassType(NORMAL_PASS); RenderState.EnableDrawBuffers(1); - } + }*/ auto cm = CM_DEFAULT; // di->SetFullbrightFlags(mainview ? vp.camera->player : nullptr); float flash = 1.f; diff --git a/wadsrc/static/shaders/scene/frag_main.glsl b/wadsrc/static/shaders/scene/frag_main.glsl index ccfa6a51b..6051a0eb2 100644 --- a/wadsrc/static/shaders/scene/frag_main.glsl +++ b/wadsrc/static/shaders/scene/frag_main.glsl @@ -2,7 +2,7 @@ void main() { #ifdef USE_LEVELMESH - FragColor = vec4(fract(gl_FragCoord.x / 500), fract(gl_FragCoord.x / 500), 1.0, 1.0); + FragColor = vec4(vec3(pixelpos.w / 1000), 1.0); #else #ifdef NO_CLIPDISTANCE_SUPPORT diff --git a/wadsrc/static/shaders/scene/vert_main.glsl b/wadsrc/static/shaders/scene/vert_main.glsl index dbd1c6f0e..8f0bb0271 100644 --- a/wadsrc/static/shaders/scene/vert_main.glsl +++ b/wadsrc/static/shaders/scene/vert_main.glsl @@ -13,6 +13,10 @@ void main() parmTexCoord = aTexCoord; parmPosition = bones.Position; + #ifdef USE_LEVELMESH + parmPosition.xyz = parmPosition.xzy; // The level mesh is in world coordinates + #endif + #ifndef SIMPLE vec4 worldcoord = ModelMatrix * mix(parmPosition, aVertex2, uInterpolationFactor); #else