diff --git a/Renderer.cs b/Renderer.cs index efa2e38..fa36434 100644 --- a/Renderer.cs +++ b/Renderer.cs @@ -33,14 +33,8 @@ namespace Kav private SkyboxEffect SkyboxEffect { get; } private DiffuseLitSpriteEffect DiffuseLitSpriteEffect { get; } - private RenderTarget2D GPosition { get; } - private RenderTarget2D GNormal { get; } - private RenderTarget2D GAlbedo { get; } - private RenderTarget2D GMetallicRoughness { get; } private RenderTargetCube PointShadowCubeMap { get; } - private RenderTargetBinding[] GBuffer { get; } - private Kav.Model UnitCube { get; } private SpriteBatch SpriteBatch { get; } @@ -85,49 +79,6 @@ namespace Kav RenderTargetUsage.PreserveContents ); - GPosition = new RenderTarget2D( - GraphicsDevice, - renderDimensionsX, - renderDimensionsY, - false, - SurfaceFormat.Vector4, - DepthFormat.Depth24 - ); - - GNormal = new RenderTarget2D( - GraphicsDevice, - renderDimensionsX, - renderDimensionsY, - false, - SurfaceFormat.Vector4, - DepthFormat.None - ); - - GAlbedo = new RenderTarget2D( - GraphicsDevice, - renderDimensionsX, - renderDimensionsY, - false, - SurfaceFormat.Color, - DepthFormat.None - ); - - GMetallicRoughness = new RenderTarget2D( - GraphicsDevice, - renderDimensionsX, - renderDimensionsY, - false, - SurfaceFormat.HalfVector2, - DepthFormat.None - ); - - GBuffer = new RenderTargetBinding[4] { - new RenderTargetBinding(GPosition), - new RenderTargetBinding(GNormal), - new RenderTargetBinding(GAlbedo), - new RenderTargetBinding(GMetallicRoughness) - }; - PointShadowCubeMap = new RenderTargetCube( GraphicsDevice, shadowMapSize, @@ -172,126 +123,6 @@ namespace Kav ); } - public void DeferredRender( - RenderTarget2D renderTarget, - PerspectiveCamera camera, - IEnumerable<(Model, Matrix)> modelTransforms, - AmbientLight ambientLight, - IEnumerable pointLights, - DirectionalLight? directionalLight - ) { - GBufferRender(GBuffer, camera, modelTransforms); - - GraphicsDevice.SetRenderTarget(ColorRenderTarget); - GraphicsDevice.Clear(Color.Black); - - AmbientLightRender( - ColorRenderTarget, - GPosition, - GAlbedo, - ambientLight - ); - - DeferredPointLightEffect.EyePosition = camera.Position; - - foreach (var pointLight in pointLights) - { - PointLightRender( - ColorRenderTarget, - GPosition, - GAlbedo, - GNormal, - GMetallicRoughness, - camera, - modelTransforms, - pointLight - ); - } - - if (directionalLight.HasValue) - { - DirectionalLightRender( - ColorRenderTarget, - GPosition, - GAlbedo, - GNormal, - GMetallicRoughness, - camera, - modelTransforms, - directionalLight.Value, - NumShadowCascades - ); - } - - GraphicsDevice.SetRenderTarget(renderTarget); - SpriteBatch.Begin(SpriteSortMode.Deferred, BlendState.Opaque, null, null, null, ToneMapEffect); - SpriteBatch.Draw(ColorRenderTarget, Vector2.Zero, Color.White); - SpriteBatch.End(); - } - - public void DeferredToonRender( - RenderTarget2D renderTarget, - PerspectiveCamera camera, - IEnumerable<(Model, Matrix)> modelTransforms, - AmbientLight ambientLight, - IEnumerable pointLights, - DirectionalLight? directionalLight, - TextureCube skybox - ) { - GBufferRender(GBuffer, camera, modelTransforms); - - GraphicsDevice.SetRenderTarget(ColorRenderTarget); - GraphicsDevice.Clear(ClearOptions.Target | ClearOptions.DepthBuffer, Color.Black, 1f, 0); - GraphicsDevice.DepthStencilState = DepthStencilState.Default; - - DepthRender(camera, modelTransforms); - GraphicsDevice.DepthStencilState = DepthStencilState.DepthRead; - - AmbientLightRender( - ColorRenderTarget, - GPosition, - GAlbedo, - ambientLight - ); - - foreach (var pointLight in pointLights) - { - PointLightRender( - ColorRenderTarget, - GPosition, - GAlbedo, - GNormal, - GMetallicRoughness, - camera, - modelTransforms, - pointLight - ); - } - - if (directionalLight.HasValue) - { - DirectionalLightToonRender( - ColorRenderTarget, - GPosition, - GAlbedo, - GNormal, - GMetallicRoughness, - camera, - modelTransforms, - directionalLight.Value, - NumShadowCascades, - false - ); - } - - SkyboxRender(ColorRenderTarget, camera, skybox); - - GraphicsDevice.SetRenderTarget(renderTarget); - SpriteBatch.Begin(SpriteSortMode.Deferred, BlendState.Opaque, null, null, null, null); - SpriteBatch.Draw(ColorRenderTarget, Vector2.Zero, Color.White); - SpriteBatch.End(); - } - // TODO: we could make this a lot more efficient probably // draws mesh sprites with a forward rendered diffuse lighting technique public void MeshSpriteRender( @@ -307,7 +138,7 @@ namespace Kav GraphicsDevice.Clear(ClearOptions.Target | ClearOptions.DepthBuffer, Color.Black, 1f, 0); GraphicsDevice.DepthStencilState = DepthStencilState.Default; - DepthRender(camera, modelTransforms); + DepthRender(ColorRenderTarget, camera, modelTransforms); GraphicsDevice.Clear(ClearOptions.Target, new Color(0, 0, 0, 0), 1f, 0); GraphicsDevice.DepthStencilState = DepthStencilState.DepthRead; @@ -401,10 +232,14 @@ namespace Kav SpriteBatch.End(); } - private void DepthRender( + public void DepthRender( + RenderTarget2D renderTarget, PerspectiveCamera camera, IEnumerable<(Model, Matrix)> modelTransforms ) { + GraphicsDevice.SetRenderTarget(renderTarget); + GraphicsDevice.DepthStencilState = DepthStencilState.Default; + var boundingFrustum = new BoundingFrustum(camera.View * camera.Projection); foreach (var (model, transform) in FrustumCull(boundingFrustum, modelTransforms)) @@ -438,7 +273,7 @@ namespace Kav } } - private void SkyboxRender( + public void SkyboxRender( RenderTarget2D renderTarget, PerspectiveCamera camera, TextureCube skybox @@ -586,6 +421,7 @@ namespace Kav ) { GraphicsDevice.SetRenderTarget(renderTarget); GraphicsDevice.BlendState = BlendState.Opaque; + GraphicsDevice.DepthStencilState = DepthStencilState.DepthRead; DeferredAmbientLightEffect.GPosition = gPosition; DeferredAmbientLightEffect.GAlbedo = gAlbedo; @@ -621,6 +457,8 @@ namespace Kav DeferredPointLightEffect.GMetallicRoughness = gMetallicRoughness; DeferredPointLightEffect.ShadowMap = PointShadowCubeMap; + DeferredPointLightEffect.EyePosition = camera.Position; + DeferredPointLightEffect.PointLightPosition = pointLight.Position; DeferredPointLightEffect.PointLightColor = pointLight.Color.ToVector3() * pointLight.Intensity; @@ -686,7 +524,7 @@ namespace Kav } } - private void DirectionalLightToonRender( + public void DirectionalLightToonRender( RenderTarget2D renderTarget, Texture2D gPosition, Texture2D gAlbedo,