From 42f66e8a874c85f5bcea52470b820f4411b741aa Mon Sep 17 00:00:00 2001 From: cosmonaut Date: Thu, 6 Jun 2024 14:38:53 -0700 Subject: [PATCH] MSAAExample --- Examples/MSAACubeExample.cs | 1 - Examples/MSAAExample.cs | 150 +++++++++++++++++++++++++++++++++ Examples/MSAAGame.cs | 151 ---------------------------------- MoonWorksGraphicsTests.csproj | 1 + Program.cs | 3 +- 5 files changed, 153 insertions(+), 153 deletions(-) create mode 100644 Examples/MSAAExample.cs delete mode 100644 Examples/MSAAGame.cs diff --git a/Examples/MSAACubeExample.cs b/Examples/MSAACubeExample.cs index d3dcbcc..a465d76 100644 --- a/Examples/MSAACubeExample.cs +++ b/Examples/MSAACubeExample.cs @@ -2,7 +2,6 @@ using MoonWorks.Graphics; using MoonWorks.Math.Float; using MoonWorks.Math; -using System.Runtime.InteropServices; using MoonWorks.Input; namespace MoonWorksGraphicsTests; diff --git a/Examples/MSAAExample.cs b/Examples/MSAAExample.cs new file mode 100644 index 0000000..21a8642 --- /dev/null +++ b/Examples/MSAAExample.cs @@ -0,0 +1,150 @@ +using MoonWorks; +using MoonWorks.Graphics; +using MoonWorks.Input; + +namespace MoonWorksGraphicsTests; + +class MSAAExample : Example +{ + private GraphicsPipeline[] MsaaPipelines = new GraphicsPipeline[4]; + private Texture[] RenderTargets = new Texture[4]; + private Sampler RTSampler; + + private SampleCount currentSampleCount; + + public override void Init(Window window, GraphicsDevice graphicsDevice, Inputs inputs) + { + Window = window; + GraphicsDevice = graphicsDevice; + Inputs = inputs; + + Window.SetTitle("MSAA"); + + currentSampleCount = SampleCount.Four; + + Logger.LogInfo("Press Left and Right to cycle between sample counts"); + Logger.LogInfo("Setting sample count to: " + currentSampleCount); + + // Create the MSAA pipelines + Shader triangleVertShader = new Shader( + GraphicsDevice, + TestUtils.GetShaderPath("RawTriangle.vert"), + "main", + ShaderStage.Vertex, + ShaderFormat.SPIRV + ); + + Shader triangleFragShader = new Shader( + GraphicsDevice, + TestUtils.GetShaderPath("SolidColor.frag"), + "main", + ShaderStage.Fragment, + ShaderFormat.SPIRV + ); + + GraphicsPipelineCreateInfo pipelineCreateInfo = TestUtils.GetStandardGraphicsPipelineCreateInfo( + TextureFormat.R8G8B8A8, + triangleVertShader, + triangleFragShader + ); + for (int i = 0; i < MsaaPipelines.Length; i += 1) + { + pipelineCreateInfo.MultisampleState.MultisampleCount = (SampleCount) i; + MsaaPipelines[i] = new GraphicsPipeline(GraphicsDevice, pipelineCreateInfo); + } + + // Create the blit pipeline + /* + ShaderModule blitVertShaderModule = new ShaderModule(GraphicsDevice, TestUtils.GetShaderPath("TexturedQuad.vert")); + ShaderModule blitFragShaderModule = new ShaderModule(GraphicsDevice, TestUtils.GetShaderPath("TexturedQuad.frag")); + + pipelineCreateInfo = TestUtils.GetStandardGraphicsPipelineCreateInfo( + MainWindow.SwapchainFormat, + blitVertShaderModule, + blitFragShaderModule + ); + pipelineCreateInfo.VertexInputState = VertexInputState.CreateSingleBinding(); + pipelineCreateInfo.FragmentShaderInfo.SamplerBindingCount = 1; + blitPipeline = new GraphicsPipeline(GraphicsDevice, pipelineCreateInfo); + */ + + // Create the MSAA render textures + for (int i = 0; i < RenderTargets.Length; i += 1) + { + RenderTargets[i] = Texture.CreateTexture2D( + GraphicsDevice, + Window.Width, + Window.Height, + TextureFormat.R8G8B8A8, + TextureUsageFlags.ColorTarget | TextureUsageFlags.Sampler, + 1, + (SampleCount) i + ); + } + + // Create the sampler + RTSampler = new Sampler(GraphicsDevice, SamplerCreateInfo.PointClamp); + } + + public override void Update(System.TimeSpan delta) + { + SampleCount prevSampleCount = currentSampleCount; + + if (TestUtils.CheckButtonPressed(Inputs, TestUtils.ButtonType.Left)) + { + currentSampleCount -= 1; + if (currentSampleCount < 0) + { + currentSampleCount = SampleCount.Eight; + } + } + if (TestUtils.CheckButtonPressed(Inputs, TestUtils.ButtonType.Right)) + { + currentSampleCount += 1; + if (currentSampleCount > SampleCount.Eight) + { + currentSampleCount = SampleCount.One; + } + } + + if (prevSampleCount != currentSampleCount) + { + Logger.LogInfo("Setting sample count to: " + currentSampleCount); + } + } + + public override void Draw(double alpha) + { + CommandBuffer cmdbuf = GraphicsDevice.AcquireCommandBuffer(); + Texture swapchainTexture = cmdbuf.AcquireSwapchainTexture(Window); + if (swapchainTexture != null) + { + Texture rt = RenderTargets[(int) currentSampleCount]; + + var renderPass = cmdbuf.BeginRenderPass( + new ColorAttachmentInfo( + rt, + true, + Color.Black + ) + ); + renderPass.BindGraphicsPipeline(MsaaPipelines[(int) currentSampleCount]); + renderPass.DrawPrimitives(0, 1); + cmdbuf.EndRenderPass(renderPass); + + cmdbuf.Blit(rt, swapchainTexture, Filter.Nearest, false); + } + GraphicsDevice.Submit(cmdbuf); + } + + public override void Destroy() + { + for (var i = 0; i < 4; i += 1) + { + MsaaPipelines[i].Dispose(); + RenderTargets[i].Dispose(); + } + + RTSampler.Dispose(); + } +} diff --git a/Examples/MSAAGame.cs b/Examples/MSAAGame.cs deleted file mode 100644 index fd23c62..0000000 --- a/Examples/MSAAGame.cs +++ /dev/null @@ -1,151 +0,0 @@ -using MoonWorks; -using MoonWorks.Math.Float; -using MoonWorks.Graphics; - -namespace MoonWorks.Test -{ - class MSAAGame : Game - { - private GraphicsPipeline[] msaaPipelines = new GraphicsPipeline[4]; - private GraphicsPipeline blitPipeline; - - private Texture[] renderTargets = new Texture[4]; - private Sampler rtSampler; - private GpuBuffer quadVertexBuffer; - private GpuBuffer quadIndexBuffer; - - private SampleCount currentSampleCount = SampleCount.Four; - - public MSAAGame() : base(TestUtils.GetStandardWindowCreateInfo(), TestUtils.GetStandardFrameLimiterSettings(), TestUtils.PreferredBackends, 60, true) - { - Logger.LogInfo("Press Left and Right to cycle between sample counts"); - Logger.LogInfo("Setting sample count to: " + currentSampleCount); - - // Create the MSAA pipelines - ShaderModule triangleVertShaderModule = new ShaderModule(GraphicsDevice, TestUtils.GetShaderPath("RawTriangle.vert")); - ShaderModule triangleFragShaderModule = new ShaderModule(GraphicsDevice, TestUtils.GetShaderPath("SolidColor.frag")); - - GraphicsPipelineCreateInfo pipelineCreateInfo = TestUtils.GetStandardGraphicsPipelineCreateInfo( - TextureFormat.R8G8B8A8, - triangleVertShaderModule, - triangleFragShaderModule - ); - for (int i = 0; i < msaaPipelines.Length; i += 1) - { - pipelineCreateInfo.MultisampleState.MultisampleCount = (SampleCount) i; - msaaPipelines[i] = new GraphicsPipeline(GraphicsDevice, pipelineCreateInfo); - } - - // Create the blit pipeline - ShaderModule blitVertShaderModule = new ShaderModule(GraphicsDevice, TestUtils.GetShaderPath("TexturedQuad.vert")); - ShaderModule blitFragShaderModule = new ShaderModule(GraphicsDevice, TestUtils.GetShaderPath("TexturedQuad.frag")); - - pipelineCreateInfo = TestUtils.GetStandardGraphicsPipelineCreateInfo( - MainWindow.SwapchainFormat, - blitVertShaderModule, - blitFragShaderModule - ); - pipelineCreateInfo.VertexInputState = VertexInputState.CreateSingleBinding(); - pipelineCreateInfo.FragmentShaderInfo.SamplerBindingCount = 1; - blitPipeline = new GraphicsPipeline(GraphicsDevice, pipelineCreateInfo); - - // Create the MSAA render textures - for (int i = 0; i < renderTargets.Length; i += 1) - { - renderTargets[i] = Texture.CreateTexture2D( - GraphicsDevice, - MainWindow.Width, - MainWindow.Height, - TextureFormat.R8G8B8A8, - TextureUsageFlags.ColorTarget | TextureUsageFlags.Sampler, - 1, - (SampleCount) i - ); - } - - // Create the sampler - rtSampler = new Sampler(GraphicsDevice, SamplerCreateInfo.PointClamp); - - // Create and populate the vertex and index buffers - var resourceUploader = new ResourceUploader(GraphicsDevice); - - quadVertexBuffer = resourceUploader.CreateBuffer( - [ - new PositionTextureVertex(new Vector3(-1, -1, 0), new Vector2(0, 0)), - new PositionTextureVertex(new Vector3(1, -1, 0), new Vector2(1, 0)), - new PositionTextureVertex(new Vector3(1, 1, 0), new Vector2(1, 1)), - new PositionTextureVertex(new Vector3(-1, 1, 0), new Vector2(0, 1)) - ], - BufferUsageFlags.Vertex - ); - - quadIndexBuffer = resourceUploader.CreateBuffer( - [ - 0, 1, 2, - 0, 2, 3 - ], - BufferUsageFlags.Index - ); - - resourceUploader.Upload(); - resourceUploader.Dispose(); - } - - protected override void Update(System.TimeSpan delta) - { - SampleCount prevSampleCount = currentSampleCount; - - if (TestUtils.CheckButtonPressed(Inputs, TestUtils.ButtonType.Left)) - { - currentSampleCount -= 1; - if (currentSampleCount < 0) - { - currentSampleCount = SampleCount.Eight; - } - } - if (TestUtils.CheckButtonPressed(Inputs, TestUtils.ButtonType.Right)) - { - currentSampleCount += 1; - if (currentSampleCount > SampleCount.Eight) - { - currentSampleCount = SampleCount.One; - } - } - - if (prevSampleCount != currentSampleCount) - { - Logger.LogInfo("Setting sample count to: " + currentSampleCount); - } - } - - protected override void Draw(double alpha) - { - CommandBuffer cmdbuf = GraphicsDevice.AcquireCommandBuffer(); - Texture? backbuffer = cmdbuf.AcquireSwapchainTexture(MainWindow); - if (backbuffer != null) - { - Texture rt = renderTargets[(int) currentSampleCount]; - - cmdbuf.BeginRenderPass(new ColorAttachmentInfo(rt, WriteOptions.Cycle, Color.Black)); - cmdbuf.BindGraphicsPipeline(msaaPipelines[(int) currentSampleCount]); - cmdbuf.DrawPrimitives(0, 1); - cmdbuf.EndRenderPass(); - - cmdbuf.BeginRenderPass(new ColorAttachmentInfo(backbuffer, WriteOptions.Cycle, LoadOp.DontCare)); - cmdbuf.BindGraphicsPipeline(blitPipeline); - cmdbuf.BindFragmentSamplers(new TextureSamplerBinding(rt, rtSampler)); - cmdbuf.BindVertexBuffers(quadVertexBuffer); - cmdbuf.BindIndexBuffer(quadIndexBuffer, IndexElementSize.Sixteen); - cmdbuf.DrawIndexedPrimitives(0, 0, 2); - cmdbuf.EndRenderPass(); - } - GraphicsDevice.Submit(cmdbuf); - } - - public static void Main(string[] args) - { - MSAAGame game = new MSAAGame(); - game.Run(); - } - } -} diff --git a/MoonWorksGraphicsTests.csproj b/MoonWorksGraphicsTests.csproj index 545d9f8..edbe6f9 100644 --- a/MoonWorksGraphicsTests.csproj +++ b/MoonWorksGraphicsTests.csproj @@ -39,6 +39,7 @@ + diff --git a/Program.cs b/Program.cs index d031660..d1109c8 100644 --- a/Program.cs +++ b/Program.cs @@ -22,7 +22,8 @@ class Program : Game new DrawIndirectExample(), new GetBufferDataExample(), new InstancingAndOffsetsExample(), - new MSAACubeExample() + new MSAACubeExample(), + new MSAAExample() ]; int ExampleIndex = 0;