From 0321bd91c43d9e27d28e01ce323141578b1e53e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20L=C3=BCbe=C3=9F?= Date: Fri, 16 Feb 2024 16:14:14 +0100 Subject: [PATCH] 3D Renderer: inverted depth buffer --- GlitchyEngine/src/Renderer/Renderer.bf | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/GlitchyEngine/src/Renderer/Renderer.bf b/GlitchyEngine/src/Renderer/Renderer.bf index 506444c..514fcf9 100644 --- a/GlitchyEngine/src/Renderer/Renderer.bf +++ b/GlitchyEngine/src/Renderer/Renderer.bf @@ -63,7 +63,8 @@ namespace GlitchyEngine.Renderer ), TargetDescription(.D24_UNorm_S8_UInt, ownDebugName: new String("DepthStencil")){ SamplerDescription = samplerDesc, - ClearColor = .DepthStencil(1.0f, 0) + // We use an inverted depth buffer so 0.0 represents the furthest distance + ClearColor = .DepthStencil(0.0f, 0) }); Target = new RenderTargetGroup(targetDesc); // TODO: there needs to be a proper way to do it @@ -101,6 +102,9 @@ namespace GlitchyEngine.Renderer static BlendState _gBufferBlend; static BlendState _lightBlend; + /// Depth Stencil State used to render objects. + static DepthStencilState _meshDepthStencilState; + /// Depth Stencil State used to render lights and other full screen effects. static DepthStencilState _fullscreenDepthState; static Buffer _sceneBuffer; @@ -195,6 +199,11 @@ namespace GlitchyEngine.Renderer RenderTargetWriteMask = .All }; _lightBlend = new BlendState(lightBlendDesc); + + DepthStencilStateDescription meshDsDesc = .Default; + // We use an inverted depth buffer so greater depth values are closer + meshDsDesc.DepthFunction = .Greater; + _meshDepthStencilState = new DepthStencilState(meshDsDesc); DepthStencilStateDescription dsDesc = .Default; dsDesc.DepthEnabled = false; @@ -213,6 +222,7 @@ namespace GlitchyEngine.Renderer _sceneBuffer.ReleaseRef(); _fullscreenDepthState.ReleaseRef(); + _meshDepthStencilState.ReleaseRef(); _lightBlend.ReleaseRef(); _gBufferBlend.ReleaseRef(); delete _gBuffer; @@ -305,6 +315,7 @@ namespace GlitchyEngine.Renderer RenderCommand.SetViewport(0, 0, _sceneConstants.CameraTarget.Width, _sceneConstants.CameraTarget.Height); RenderCommand.SetBlendState(_gBufferBlend); + RenderCommand.SetDepthStencilState(_meshDepthStencilState); for (SubmittedMesh entry in _queue) {