/// <inheritdoc /> public override void Render(GPUContext context, SceneRenderTask task, RenderTarget input, RenderTarget output) { if (Viewport == null) { throw new NullReferenceException(); } Profiler.BeginEventGPU("Editor Primitives"); // Check if use MSAA var format = output.Format; GraphicsDevice.GetFeatures(format, out var formatSupport); bool enableMsaa = formatSupport.MSAALevelMax >= MSAALevel.X4 && Editor.Instance.Options.Options.Visual.EnableMSAAForDebugDraw; // Prepare var msaaLevel = enableMsaa ? MSAALevel.X4 : MSAALevel.None; var width = output.Width; var height = output.Height; var target = RenderTarget.GetTemporary(format, width, height, TextureFlags.RenderTarget | TextureFlags.ShaderResource, msaaLevel); var targetDepth = RenderTarget.GetTemporary(PixelFormat.D24_UNorm_S8_UInt, width, height, TextureFlags.DepthStencil, msaaLevel); // Copy frame and clear depth context.Draw(target, input); context.ClearDepth(targetDepth); // Draw gizmos (collect draw calls only) _drawCallsCollector.Clear(); for (int i = 0; i < Viewport.Gizmos.Count; i++) { Viewport.Gizmos[i].Draw(_drawCallsCollector); } // Draw selected objects debug shapes and visuals if (DrawDebugDraw) { var debugDrawData = Viewport.DebugDrawData; DebugDraw.Draw(task, debugDrawData.ActorsPtrs, target, context, targetDepth, true); } // Draw gizmos (actual drawing) _drawCallsCollector.ExecuteDrawCalls(context, task, target, RenderPass.ForwardPass); _drawCallsCollector.ExecuteDrawCalls(context, task, target, RenderPass.GBufferFill); // Resolve MSAA texture if (enableMsaa) { context.ResolveMultisample(target, output); } else { context.Draw(output, target); } // Cleanup RenderTarget.ReleaseTemporary(targetDepth); RenderTarget.ReleaseTemporary(target); Profiler.EndEventGPU(); }
/// <inheritdoc /> public override void Render(GPUContext context, SceneRenderTask task, GPUTexture input, GPUTexture output) { if (Viewport == null) { throw new NullReferenceException(); } Profiler.BeginEventGPU("Editor Primitives"); // Check if use MSAA var format = output.Format; GPUDevice.GetFeatures(format, out var formatSupport); bool enableMsaa = formatSupport.MSAALevelMax >= MSAALevel.X4 && Editor.Instance.Options.Options.Visual.EnableMSAAForDebugDraw; // Prepare var msaaLevel = enableMsaa ? MSAALevel.X4 : MSAALevel.None; var width = output.Width; var height = output.Height; var desc = GPUTextureDescription.New2D(width, height, format, GPUTextureFlags.RenderTarget | GPUTextureFlags.ShaderResource, 1, 1, msaaLevel); var target = RenderTargetPool.Get(ref desc); desc = GPUTextureDescription.New2D(width, height, PixelFormat.D24_UNorm_S8_UInt, GPUTextureFlags.DepthStencil, 1, 1, msaaLevel); var targetDepth = RenderTargetPool.Get(ref desc); // Copy frame and clear depth context.Draw(target, input); context.ClearDepth(targetDepth); // Draw gizmos and other editor primitives (collect draw calls only) _drawCallsCollector.Clear(); for (int i = 0; i < Viewport.Gizmos.Count; i++) { Viewport.Gizmos[i].Draw(_drawCallsCollector); } Viewport.DrawEditorPrimitives(context, task, target, targetDepth, _drawCallsCollector); // Draw gizmos (actual drawing) _drawCallsCollector.ExecuteDrawCalls(context, task, target, DrawPass.GBuffer); _drawCallsCollector.ExecuteDrawCalls(context, task, target, DrawPass.Forward); // Resolve MSAA texture if (enableMsaa) { context.ResolveMultisample(target, output); } else { context.Draw(output, target); } // Cleanup RenderTargetPool.Release(targetDepth); RenderTargetPool.Release(target); Profiler.EndEventGPU(); }
/// <inheritdoc /> public override void Render(GPUContext context, SceneRenderTask task, RenderTarget input, RenderTarget output) { Profiler.BeginEventGPU("Editor Primitives"); // Check if use MSAA // TODO: add edito option to switch between msaa and non-msaa bool enableMsaa = true; // Prepare var editor = Editor.Instance; var viewport = editor.Windows.EditWin.Viewport; var msaaLevel = enableMsaa ? MSAALevel.X4 : MSAALevel.None; var width = output.Width; var height = output.Height; var target = RenderTarget.GetTemporary(output.Format, width, height, TextureFlags.RenderTarget | TextureFlags.ShaderResource, msaaLevel); var targetDepth = RenderTarget.GetTemporary(PixelFormat.D24_UNorm_S8_UInt, width, height, TextureFlags.DepthStencil, msaaLevel); // Copy frame and clear depth context.Draw(target, input); context.ClearDepth(targetDepth); // Draw gizmos (collect draw calls only) _drawCallsCollector.Clear(); for (int i = 0; i < viewport.Gizmos.Count; i++) { viewport.Gizmos[i].Draw(_drawCallsCollector); } // Draw selected objects debug shapes and visuals var debugDrawData = viewport.DebugDrawData; DebugDraw.Draw(task, debugDrawData.ActorsPtrs, target, context, targetDepth, true); // Draw gizmos (actual drawing) _drawCallsCollector.ExecuteDrawCalls(context, task, target, RenderPass.ForwardPass); // Resolve MSAA texture if (enableMsaa) { context.ResolveMultisample(target, output); } else { context.Draw(output, target); } // Cleanup RenderTarget.ReleaseTemporary(targetDepth); RenderTarget.ReleaseTemporary(target); Profiler.EndEventGPU(); }
protected override void OnRenderUpdate(GPUContext context) { var input = GetInputOrDefault <GPUTexture>(0, null); if (input) { context.Draw(Output, input); } else { context.Clear(Output, Color.Black); } }
/// <inheritdoc /> public override void Render(GPUContext context, ref RenderContext renderContext, GPUTexture input, GPUTexture output) { if (Viewport == null) { throw new NullReferenceException(); } Profiler.BeginEventGPU("Editor Primitives"); // Check if use MSAA var format = output.Format; var formatFeatures = GPUDevice.Instance.GetFormatFeatures(format); bool enableMsaa = formatFeatures.MSAALevelMax >= MSAALevel.X4 && Editor.Instance.Options.Options.Visual.EnableMSAAForDebugDraw; // Prepare var msaaLevel = enableMsaa ? MSAALevel.X4 : MSAALevel.None; var width = output.Width; var height = output.Height; var desc = GPUTextureDescription.New2D(width, height, format, GPUTextureFlags.RenderTarget | GPUTextureFlags.ShaderResource, 1, 1, msaaLevel); var target = RenderTargetPool.Get(ref desc); desc = GPUTextureDescription.New2D(width, height, PixelFormat.D24_UNorm_S8_UInt, GPUTextureFlags.DepthStencil, 1, 1, msaaLevel); var targetDepth = RenderTargetPool.Get(ref desc); // Copy frame and clear depth context.Draw(target, input); context.ClearDepth(targetDepth.View()); context.SetViewport(width, height); context.SetRenderTarget(targetDepth.View(), target.View()); // Draw gizmos and other editor primitives var renderList = RenderList.GetFromPool(); var prevList = renderContext.List; renderContext.List = renderList; for (int i = 0; i < Viewport.Gizmos.Count; i++) { Viewport.Gizmos[i].Draw(ref renderContext); } Viewport.DrawEditorPrimitives(context, ref renderContext, target, targetDepth); // Sort draw calls renderList.SortDrawCalls(ref renderContext, false, DrawCallsListType.GBuffer); renderList.SortDrawCalls(ref renderContext, false, DrawCallsListType.GBufferNoDecals); renderList.SortDrawCalls(ref renderContext, true, DrawCallsListType.Forward); // Perform the rendering renderContext.View.Pass = DrawPass.GBuffer; renderList.ExecuteDrawCalls(ref renderContext, DrawCallsListType.GBuffer); renderList.ExecuteDrawCalls(ref renderContext, DrawCallsListType.GBufferNoDecals); renderContext.View.Pass = DrawPass.Forward; renderList.ExecuteDrawCalls(ref renderContext, DrawCallsListType.Forward); // Resolve MSAA texture if (enableMsaa) { context.ResolveMultisample(target, output); } else { context.Draw(output, target); } // Cleanup RenderTargetPool.Release(targetDepth); RenderTargetPool.Release(target); RenderList.ReturnToPool(renderList); renderContext.List = prevList; Profiler.EndEventGPU(); }
protected override void OnRenderUpdate(GPUContext context) { Output.Size = Size; context.Draw(Output, Texture); Return(0, Output); }