From fccbc0d975c96f5aecd6dea79173bafceb0df246 Mon Sep 17 00:00:00 2001 From: metalgearsloth Date: Sun, 6 Oct 2024 18:17:05 +1100 Subject: [PATCH] Fix stencilling --- .../Graphics/Clyde/Clyde.LightRendering.cs | 25 ++++++++++++++----- 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/Robust.Client/Graphics/Clyde/Clyde.LightRendering.cs b/Robust.Client/Graphics/Clyde/Clyde.LightRendering.cs index 2c6ad239364..3227fb6151b 100644 --- a/Robust.Client/Graphics/Clyde/Clyde.LightRendering.cs +++ b/Robust.Client/Graphics/Clyde/Clyde.LightRendering.cs @@ -410,18 +410,20 @@ private void DrawLightsAndFov(Viewport viewport, Box2Rotated worldBounds, Box2 w GL.StencilMask(0xFF); GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.StencilBufferBit); CheckGlError(); + var oldTarget = _currentRenderTarget; var oldProj = _currentMatrixProj; var oldShader = _queuedShaderInstance; var oldModel = _currentMatrixModel; var oldScissor = _currentScissorState; var oldScissoring = _isScissoring; - _lightingReady = true; RenderOverlays(viewport, OverlaySpace.BeforeLighting, worldAABB, worldBounds); - GL.Viewport(0, 0, lightW, lightH); - BindVertexArray(_occlusionVao.Handle); + // Batching doesn't restore stencil state so we do it here. + // Yes I spent 8 hours across 2 days just to track down this as the problem. + GL.Enable(EnableCap.StencilTest); + _isStencilling = true; DebugTools.Assert(oldScissoring.Equals(_isScissoring)); DebugTools.Assert(oldScissor.Equals(_currentScissorState)); DebugTools.Assert(oldModel.Equals(_currentMatrixModel)); @@ -552,6 +554,7 @@ private void DrawLightsAndFov(Viewport viewport, Box2Rotated worldBounds, Box2 w GL.Viewport(0, 0, viewport.Size.X, viewport.Size.Y); CheckGlError(); + _lightingReady = true; Array.Clear(_lightsToRenderList, 0, count); } @@ -1163,6 +1166,10 @@ private void RegenLightRts(Viewport viewport) viewport.WallMaskRenderTarget?.Dispose(); viewport.WallBleedIntermediateRenderTarget1?.Dispose(); viewport.WallBleedIntermediateRenderTarget2?.Dispose(); + var lightMapColorFormat = _hasGLFloatFramebuffers + ? RenderTargetColorFormat.R11FG11FB10F + : RenderTargetColorFormat.Rgba8; + var lightMapSampleParameters = new TextureSampleParameters { Filter = true }; viewport.WallMaskRenderTarget = CreateRenderTarget(viewport.Size, RenderTargetColorFormat.R8, name: $"{viewport.Name}-{nameof(viewport.WallMaskRenderTarget)}"); @@ -1170,13 +1177,19 @@ private void RegenLightRts(Viewport viewport) viewport.LightRenderTarget = (RenderTexture) CreateLightRenderTarget(lightMapSize, $"{viewport.Name}-{nameof(viewport.LightRenderTarget)}"); - viewport.LightBlurTarget = (RenderTexture) CreateLightRenderTarget(lightMapSize, + viewport.LightBlurTarget = CreateRenderTarget(lightMapSize, + new RenderTargetFormatParameters(lightMapColorFormat), + lightMapSampleParameters, $"{viewport.Name}-{nameof(viewport.LightBlurTarget)}"); - viewport.WallBleedIntermediateRenderTarget1 = (RenderTexture) CreateLightRenderTarget(lightMapSizeQuart, + viewport.WallBleedIntermediateRenderTarget1 = CreateRenderTarget(lightMapSizeQuart, + new RenderTargetFormatParameters(lightMapColorFormat), + lightMapSampleParameters, $"{viewport.Name}-{nameof(viewport.WallBleedIntermediateRenderTarget1)}"); - viewport.WallBleedIntermediateRenderTarget2 = (RenderTexture) CreateLightRenderTarget(lightMapSizeQuart, + viewport.WallBleedIntermediateRenderTarget2 = CreateRenderTarget(lightMapSizeQuart, + new RenderTargetFormatParameters(lightMapColorFormat), + lightMapSampleParameters, $"{viewport.Name}-{nameof(viewport.WallBleedIntermediateRenderTarget2)}"); }