private void Render() { { var ctx = m_swapChain.CreateGraphicsComputeCommandContext(); var backBuffer = m_swapChain.BackBuffer; var size = backBuffer.Size2D; var w = (uint)backBuffer.Size2D.Width; var h = (uint)backBuffer.Size2D.Height; var frameColorBuffer = m_ctx.CreateFrameColorBuffer(w, h, GraphicsFormat.R8G8B8A8_UNORM, ResourceState.RenderTarget); var frameDepthBuffer = m_ctx.CreateFrameDepthBuffer(w, h, DepthBufferFormat.Depth32Single, ResourceState.DepthWrite); var postProcess = m_ctx.CreateFrameColorBuffer(w, h, GraphicsFormat.R8G8B8A8_UNORM, ResourceState.UnorderedAccess); ctx.SetRenderTarget(frameColorBuffer, frameDepthBuffer); ctx.SetGraphicsPipelineStateObject(m_triangle); ctx.SetDescriptorHeaps(); ctx.Clear(frameColorBuffer); ctx.Clear(frameDepthBuffer); ctx.SetPrimitiveTopology(PrimitiveTopology.TriangleList); { Size2D s = size; { ViewPort v; v.MinDepth = 0.0f; v.MaxDepth = 1.0f; v.TopLeftX = 0.0f; v.TopLeftY = 0.0f; v.Width = s.Width; v.Height = s.Height; ctx.SetViewPort(v); } { Rectangle2D v; v.Left = 0; v.Top = 0; v.Right = s.Width; v.Bottom = s.Height; ctx.SetScissorRectangle(v); } } ctx.SetGraphicsSRV(5, 0, m_buffer); ctx.SetGraphicsSRV(5, 1, m_texture); ctx.Draw(3, 0); ctx.TransitionResource(frameColorBuffer, ResourceState.RenderTarget, ResourceState.NonPixelShaderResource); ctx.SetComputePipelineStateObject(m_compute); ctx.SetComputeUAV(4, 0, postProcess); ctx.SetComputeSRV(5, 0, frameColorBuffer); ctx.Dispatch((w + 7) / 8, (h + 7) / 8, 1); ctx.TransitionResource(backBuffer, ResourceState.Present, ResourceState.CopyDestination); ctx.TransitionResource(postProcess, ResourceState.UnorderedAccess, ResourceState.CopySource); ctx.CopyResource(backBuffer, postProcess); ctx.TransitionResource(backBuffer, ResourceState.CopyDestination, ResourceState.Present); ctx.Submit(); } m_swapChain.Present(); m_swapChain.MoveToNextFrame(); //flush all buffers m_ctx.Sync(); m_swapChain.Sync(); }
private void Render() { { var ctx = m_swapChain.CreateGraphicsComputeCommandContext(); var backBuffer = m_swapChain.BackBuffer; var size = backBuffer.Size2D; var w = (uint)backBuffer.Size2D.Width; var h = (uint)backBuffer.Size2D.Height; var albedo = m_ctx.CreateFrameColorBuffer(w, h, GraphicsFormat.R8G8B8A8_UNORM, ResourceState.RenderTarget); var depth = m_ctx.CreateFrameDepthBuffer(w, h, DepthBufferFormat.Depth32Single, ResourceState.DepthWrite); ctx.SetRenderTarget(albedo, depth); ctx.SetDescriptorHeaps(); ctx.Clear(albedo); ctx.Clear(depth); AlbedoPassData albedoPass; DepthPassData depthPass; { Size2D s = size; { ViewPort v; v.MinDepth = 0.0f; v.MaxDepth = 1.0f; v.TopLeftX = 0.0f; v.TopLeftY = 0.0f; v.Width = s.Width; v.Height = s.Height; albedoPass.ViewPort.Width = v.Width; albedoPass.ViewPort.Height = v.Height; albedoPass.ViewPort.MinimumZ = v.MinDepth; albedoPass.ViewPort.MaximumZ = v.MaxDepth; depthPass.ViewPort.Width = v.Width; depthPass.ViewPort.Height = v.Height; depthPass.ViewPort.MinimumZ = v.MinDepth; depthPass.ViewPort.MaximumZ = v.MaxDepth; ctx.SetViewPort(v); } { Rectangle2D v; v.Left = 0; v.Top = 0; v.Right = s.Width; v.Bottom = s.Height; ctx.SetScissorRectangle(v); } } albedoPass.Camera.ViewTransform = CameraMatrix(); albedoPass.Camera.PerspectiveTransform = PerspectiveMatrix(); depthPass.Camera.ViewTransform = CameraMatrix(); depthPass.Camera.PerspectiveTransform = PerspectiveMatrix(); //Depth prime the buffer { m_mechanicMaterial.SubmitDepth(depthPass, ctx); m_mechanicModel.SubmitDepth(ctx); m_mechanicInstance.SubmitDepth(ctx); } //Read from the buffer, submit with depth test ctx.TransitionResource(depth, ResourceState.DepthWrite, ResourceState.DepthRead); { //Submit per material data m_mechanicMaterial.SubmitAlbedo(albedoPass, ctx); //Submit Per Model Data m_mechanicModel.SubmitAlbedo(ctx); //Submit as many instances with different world matrices m_mechanicInstance.SubmitAlbedo(ctx); } ctx.TransitionResource(albedo, ResourceState.RenderTarget, ResourceState.CopySource); ctx.TransitionResource(backBuffer, ResourceState.Present, ResourceState.CopyDestination); ctx.CopyResource(backBuffer, albedo); ctx.TransitionResource(backBuffer, ResourceState.CopyDestination, ResourceState.Present); ctx.Submit(); } m_swapChain.Present(); m_swapChain.MoveToNextFrame(); //flush all buffers m_ctx.Sync(); m_swapChain.Sync(); }