From 8f570e04f0aa47a53441cd22c7e8bc8540f29d2f Mon Sep 17 00:00:00 2001 From: cosmonaut Date: Mon, 7 Dec 2020 01:59:43 -0800 Subject: [PATCH] move more rendering responsibilities to application --- Kav | 2 +- KavTest/Renderers/SceneRenderer.cs | 165 +++++++++++++++++++++-------- 2 files changed, 122 insertions(+), 45 deletions(-) diff --git a/Kav b/Kav index c9a4e35..8b43e8f 160000 --- a/Kav +++ b/Kav @@ -1 +1 @@ -Subproject commit c9a4e3581699ce3c1a03837be0a9c9492560a706 +Subproject commit 8b43e8f45ee6fa35f5c4d4924a62a3fcafe61301 diff --git a/KavTest/Renderers/SceneRenderer.cs b/KavTest/Renderers/SceneRenderer.cs index 6cfe9c9..8b27c18 100644 --- a/KavTest/Renderers/SceneRenderer.cs +++ b/KavTest/Renderers/SceneRenderer.cs @@ -15,6 +15,14 @@ namespace KavTest.Renderers private SpriteBatch SpriteBatch { get; } private Kav.Renderer Renderer { get; } + + private RenderTargetBinding[] GBuffer { get; } + + private RenderTarget2D GPosition { get; } + private RenderTarget2D GNormal { get; } + private RenderTarget2D GAlbedo { get; } + private RenderTarget2D GMetallicRoughness { get; } + private RenderTarget2D DeferredTarget { get; } private RenderTarget2D BillboardTarget { get; } @@ -111,18 +119,23 @@ namespace KavTest.Renderers public SceneRenderer(GraphicsDevice graphicsDevice) { + GraphicsDevice = graphicsDevice; + + var renderDimensionsX = GraphicsDevice.PresentationParameters.BackBufferWidth; + var renderDimensionsY = GraphicsDevice.PresentationParameters.BackBufferHeight; + Renderer = new Kav.Renderer( - graphicsDevice, - graphicsDevice.PresentationParameters.BackBufferWidth, - graphicsDevice.PresentationParameters.BackBufferHeight, + GraphicsDevice, + renderDimensionsX, + renderDimensionsY, 4, 4096 ); DeferredTarget = new RenderTarget2D( - graphicsDevice, - graphicsDevice.PresentationParameters.BackBufferWidth, - graphicsDevice.PresentationParameters.BackBufferHeight, + GraphicsDevice, + renderDimensionsX, + renderDimensionsY, false, SurfaceFormat.Color, DepthFormat.Depth24Stencil8, @@ -131,9 +144,9 @@ namespace KavTest.Renderers ); BillboardTarget = new RenderTarget2D( - graphicsDevice, - graphicsDevice.PresentationParameters.BackBufferWidth, - graphicsDevice.PresentationParameters.BackBufferHeight, + GraphicsDevice, + renderDimensionsX, + renderDimensionsY, false, SurfaceFormat.Color, DepthFormat.Depth24Stencil8, @@ -141,7 +154,49 @@ namespace KavTest.Renderers RenderTargetUsage.PreserveContents ); - GraphicsDevice = graphicsDevice; + 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) + }; + SpriteBatch = new SpriteBatch(GraphicsDevice); } @@ -163,37 +218,67 @@ namespace KavTest.Renderers cameraComponent.FarPlane ); - // if (SomeComponent()) - // { - // ref readonly var directionalLightEntity = ref ReadEntity(); - // ref readonly var directionalLightTransformComponent = ref GetComponent(directionalLightEntity); - // ref readonly var directionalLightComponent = ref GetComponent(directionalLightEntity); + GraphicsDevice.SetRenderTargets(GBuffer); + GraphicsDevice.Clear(ClearOptions.Target | ClearOptions.DepthBuffer, Color.Black, 1f, 0); - // Renderer.DepthRender( - // ModelTransforms, - // new Kav.DirectionalLight( - // directionalLightTransformComponent.Transform.Forward, - // directionalLightComponent.Color, - // directionalLightComponent.Intensity - // ) - // ); - // } + Renderer.GBufferRender( + GBuffer, + camera, + ModelTransforms + ); - // Renderer.DeferredRender( - // camera, - // ModelTransforms, - // AmbientLight, - // PointLights, - // DirectionalLight() - // ); + GraphicsDevice.SetRenderTarget(DeferredTarget); + GraphicsDevice.Clear(ClearOptions.Target | ClearOptions.DepthBuffer, Color.Black, 1f, 0); + GraphicsDevice.DepthStencilState = DepthStencilState.Default; - Renderer.DeferredToonRender( + Renderer.DepthRender( + DeferredTarget, + camera, + ModelTransforms + ); + + Renderer.AmbientLightRender( + DeferredTarget, + GPosition, + GAlbedo, + AmbientLight + ); + + foreach (var pointLight in PointLights) + { + Renderer.PointLightRender( + DeferredTarget, + GPosition, + GAlbedo, + GNormal, + GMetallicRoughness, + camera, + ModelTransforms, + pointLight + ); + } + + var directionalLight = DirectionalLight(); + + if (directionalLight.HasValue) + { + Renderer.DirectionalLightToonRender( + DeferredTarget, + GPosition, + GAlbedo, + GNormal, + GMetallicRoughness, + camera, + ModelTransforms, + directionalLight.Value, + 4, + false + ); + } + + Renderer.SkyboxRender( DeferredTarget, camera, - ModelTransforms, - AmbientLight, - PointLights, - DirectionalLight(), ReadComponent().Skybox ); @@ -212,14 +297,6 @@ namespace KavTest.Renderers SpriteBatch.Draw(DeferredTarget, Vector2.Zero, Color.White); SpriteBatch.Draw(BillboardTarget, Vector2.Zero, Color.White); SpriteBatch.End(); - - // foreach (var directionalLight in DirectionalLights) - // { - // Renderer.DepthRender( - // ModelTransforms, - // directionalLight - // ); - // } } } }