public Renderer(RenderSurface surface) { Surface = surface; ContentArchive content; using (var stream = GetType().Assembly.GetManifestResourceStream("DemoRenderer.DemoRenderer.contentarchive")) { content = ContentArchive.Load(stream); } Shapes = new ShapesExtractor(looper, pool); SphereRenderer = new RayTracedRenderer <SphereInstance>(content, @"ShapeDrawing\RenderSpheres"); CapsuleRenderer = new RayTracedRenderer <CapsuleInstance>(content, @"ShapeDrawing\RenderCapsules"); CylinderRenderer = new RayTracedRenderer <CylinderInstance>(content, @"ShapeDrawing\RenderCylinders"); BoxRenderer = new BoxRenderer(content); TriangleRenderer = new TriangleRenderer(content); MeshRenderer = new MeshRenderer(Shapes.MeshCache, content); Lines = new LineExtractor(pool, looper); LineRenderer = new LineRenderer(content); Background = new BackgroundRenderer(content); CompressToSwap = new CompressToSwap(content); ImageRenderer = new ImageRenderer(content); ImageBatcher = new ImageBatcher(pool); GlyphRenderer = new GlyphRenderer(content); TextBatcher = new TextBatcher(); UILineRenderer = new UILineRenderer(content); UILineBatcher = new UILineBatcher(); OnResize(); }
public void Dispose() { if (!disposed) { disposed = true; Background.Dispose(); CompressToSwap.Dispose(); SphereRenderer.Dispose(); CapsuleRenderer.Dispose(); BoxRenderer.Dispose(); TriangleRenderer.Dispose(); MeshRenderer.Dispose(); UILineRenderer.Dispose(); GlyphRenderer.Dispose(); dsv.Dispose(); depthBuffer.Dispose(); rtv.Dispose(); colorBuffer.Dispose(); resolvedSRV.Dispose(); resolvedRTV.Dispose(); resolvedColorBuffer.Dispose(); rasterizerState.Dispose(); opaqueDepthState.Dispose(); opaqueBlendState.Dispose(); a2cBlendState.Dispose(); uiDepthState.Dispose(); uiBlendState.Dispose(); Shapes.Dispose(); } }
protected override void DoDispose() { Background.Dispose(); CompressToSwap.Dispose(); Lines.Dispose(); SphereRenderer.Dispose(); CapsuleRenderer.Dispose(); CylinderRenderer.Dispose(); BoxRenderer.Dispose(); TriangleRenderer.Dispose(); MeshRenderer.Dispose(); UILineRenderer.Dispose(); GlyphRenderer.Dispose(); GL.DeleteFramebuffer(framebuffer); GL.DeleteTexture(depthBuffer); GL.DeleteTexture(colorBuffer); GL.DeleteFramebuffer(resolvedFramebuffer); GL.DeleteTexture(resolvedColorBuffer); Shapes.Dispose(); }
public virtual IRenderer duplicate() { TriangleRenderer triangleRenderer = new TriangleRenderer(); triangleRenderer.copy(this); return(triangleRenderer); }
protected internal virtual void copy(TriangleRenderer from) { base.copy(from); t1uw = from.t1uw; t1vw = from.t1vw; t2uw = from.t2uw; t2vw = from.t2vw; t3uw = from.t3uw; t3vw = from.t3vw; }
public void Render(Camera camera) { if (Surface.Resolution.X != depthBuffer.Description.Width || Surface.Resolution.Y != depthBuffer.Description.Height) { OnResize(); } var context = Surface.Context; Shapes.MeshCache.FlushPendingUploads(context); context.Rasterizer.SetViewport(0, 0, Surface.Resolution.X, Surface.Resolution.Y, 0.0f, 1.0f); //Note reversed depth. context.ClearDepthStencilView(dsv, DepthStencilClearFlags.Depth, 0, 0); context.ClearRenderTargetView(rtv, new SharpDX.Mathematics.Interop.RawColor4()); context.OutputMerger.SetRenderTargets(dsv, rtv); context.Rasterizer.State = rasterizerState; context.OutputMerger.SetDepthStencilState(opaqueDepthState); //All ray traced shapes use analytic coverage writes to get antialiasing. context.OutputMerger.SetBlendState(a2cBlendState); SphereRenderer.Render(context, camera, Surface.Resolution, SpanConverter.AsSpan(Shapes.spheres.Span), 0, Shapes.spheres.Count); CapsuleRenderer.Render(context, camera, Surface.Resolution, SpanConverter.AsSpan(Shapes.capsules.Span), 0, Shapes.capsules.Count); CylinderRenderer.Render(context, camera, Surface.Resolution, SpanConverter.AsSpan(Shapes.cylinders.Span), 0, Shapes.cylinders.Count); //Non-raytraced shapes just use regular opaque rendering. context.OutputMerger.SetBlendState(opaqueBlendState); BoxRenderer.Render(context, camera, Surface.Resolution, SpanConverter.AsSpan(Shapes.boxes.Span), 0, Shapes.boxes.Count); TriangleRenderer.Render(context, camera, Surface.Resolution, SpanConverter.AsSpan(Shapes.triangles.Span), 0, Shapes.triangles.Count); MeshRenderer.Render(context, camera, Surface.Resolution, SpanConverter.AsSpan(Shapes.meshes.Span), 0, Shapes.meshes.Count); LineRenderer.Render(context, camera, Surface.Resolution, SpanConverter.AsSpan(Lines.lines.Span), 0, Lines.lines.Count); Background.Render(context, camera); //Resolve MSAA rendering down to a single sample buffer for screenspace work. //Note that we're not bothering to properly handle tonemapping during the resolve. That's going to hurt quality a little, but the demos don't make use of very wide ranges. //(If for some reason you end up expanding the demos to make use of wider HDR, you can make this a custom resolve pretty easily.) context.ResolveSubresource(colorBuffer, 0, resolvedColorBuffer, 0, Format.R16G16B16A16_Float); context.OutputMerger.SetRenderTargets(resolvedRTV); //Glyph and screenspace line drawing rely on the same premultiplied alpha blending transparency. We'll handle their state out here. context.OutputMerger.SetBlendState(uiBlendState); context.OutputMerger.SetDepthStencilState(uiDepthState); ImageRenderer.PreparePipeline(context); ImageBatcher.Flush(context, Surface.Resolution, ImageRenderer); UILineBatcher.Flush(context, Surface.Resolution, UILineRenderer); GlyphRenderer.PreparePipeline(context); TextBatcher.Flush(context, Surface.Resolution, GlyphRenderer); //Note that, for now, the compress to swap handles its own depth state since it's the only post processing stage. context.OutputMerger.SetBlendState(opaqueBlendState); context.Rasterizer.State = rasterizerState; CompressToSwap.Render(context, resolvedSRV, Surface.RTV); }
public void Render(Camera camera) { if (Surface.Resolution.X != width || Surface.Resolution.Y != height) { OnResize(); } Shapes.MeshCache.FlushPendingUploads(); GL.BindFramebuffer(FramebufferTarget.Framebuffer, framebuffer); //Note reversed depth. GL.ClearDepth(0.0f); GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit); GL.Enable(EnableCap.CullFace); GL.Enable(EnableCap.DepthTest); GL.DepthFunc(DepthFunction.Greater); //All ray traced shapes use analytic coverage writes to get antialiasing. GL.Enable(EnableCap.SampleAlphaToCoverage); SphereRenderer.Render(camera, Surface.Resolution, SpanConverter.AsSpan(Shapes.spheres.Span), 0, Shapes.spheres.Count); CapsuleRenderer.Render(camera, Surface.Resolution, SpanConverter.AsSpan(Shapes.capsules.Span), 0, Shapes.capsules.Count); CylinderRenderer.Render(camera, Surface.Resolution, SpanConverter.AsSpan(Shapes.cylinders.Span), 0, Shapes.cylinders.Count); //Non-raytraced shapes just use regular opaque rendering. GL.Disable(EnableCap.SampleAlphaToCoverage); BoxRenderer.Render(camera, Surface.Resolution, SpanConverter.AsSpan(Shapes.boxes.Span), 0, Shapes.boxes.Count); TriangleRenderer.Render(camera, Surface.Resolution, SpanConverter.AsSpan(Shapes.triangles.Span), 0, Shapes.triangles.Count); MeshRenderer.Render(camera, Surface.Resolution, SpanConverter.AsSpan(Shapes.meshes.Span), 0, Shapes.meshes.Count); LineRenderer.Render(camera, Surface.Resolution, SpanConverter.AsSpan(Lines.lines.Span), 0, Lines.lines.Count); Background.Render(camera); GL.Disable(EnableCap.CullFace); GL.Disable(EnableCap.DepthTest); //Resolve MSAA rendering down to a single sample buffer for screenspace work. //Note that we're not bothering to properly handle tonemapping during the resolve. That's going to hurt quality a little, but the demos don't make use of very wide ranges. //(If for some reason you end up expanding the demos to make use of wider HDR, you can make this a custom resolve pretty easily.) GL.BlitNamedFramebuffer(framebuffer, resolvedFramebuffer, 0, 0, width, height, 0, 0, width, height, ClearBufferMask.ColorBufferBit, BlitFramebufferFilter.Nearest); GL.BindFramebuffer(FramebufferTarget.Framebuffer, resolvedFramebuffer); //Glyph and screenspace line drawing rely on the same premultiplied alpha blending transparency. We'll handle their state out here. GL.Enable(EnableCap.Blend); GL.BlendFunc(BlendingFactorSrc.One, BlendingFactorDest.OneMinusSrcAlpha); GL.BlendEquation(BlendEquationMode.FuncAdd); ImageRenderer.PreparePipeline(); ImageBatcher.Flush(Surface.Resolution, ImageRenderer); UILineBatcher.Flush(Surface.Resolution, UILineRenderer); GlyphRenderer.PreparePipeline(); TextBatcher.Flush(Surface.Resolution, GlyphRenderer); GL.Disable(EnableCap.Blend); GL.BindFramebuffer(FramebufferTarget.Framebuffer, 0); CompressToSwap.Render(resolvedColorBuffer); }
void Start() { TriangleRenderer r = gameObject.AddComponent <TriangleRenderer>(); r.setNTriangles(_numTriangles); r.setTriangleSpeed(_triangleSpeed); r.setTriangleLength(_triangleLength); Sphere s1, s2; s1 = new Sphere(_radius); s2 = new Sphere(0); r.setSurface(new LinearSurfaceInterpolation(s1, s2)); }
private void MainWindow_Loaded(object sender, RoutedEventArgs e) { const int N = 30; const int M = 18; var xArray = new double[N + 1]; var yArray = new double[M + 1]; var data = new double[N, M]; for (int i = 0; i <= N; i++) { xArray[i] = i; } for (int j = 0; j <= M; j++) { yArray[j] = j; } var image = new double[M, N]; PointCollection pc = new PointCollection() { new Point(7.0 - 0.25 + 5.0 * 2.0, 3.0 + 0.05 - 1.0 * 2.0), new Point(2.0 - 0.25, 4.0 + 0.05), new Point(25.75, 4.05), new Point(7.0 - 0.25 + 5.0 * 2.0, 3.0 + 0.05 - 1.0 * 2.0) }; image = TriangleRenderer.DrawTriangle(image, pc[0].X, pc[0].Y, pc[1].X, pc[1].Y, pc[2].X, pc[2].Y); for (int i = 0; i < N; i++) { for (int j = 0; j < M; j++) { data[i, j] = image[j, i]; } } PlotPoints = pc; XArray = xArray; YArray = yArray; Data = data; //heatmap.Plot(data, xArray, yArray); }
public World() { m_triangles = new List<Triangle>(); m_walls = new List<Segment>(); m_intersections = new List<Point>(); m_renderer = new TriangleRenderer(); m_SRenderer = new SegmentRenderer(); m_players = new List<Player>(); m_camera = new Camera(); //Creation des joueurs m_player = new Player(); m_camera.Bounds = new Box2(0, 0, 1000, 1000); m_camera.Target = m_player; Player.SetPosition(new Vector2(200, 200)); m_random = new Random(); //for (var i = 0; i < 20; i++) //{ // var x = m_random.Next(0, 500); // var y = m_random.Next(0, 500); // var p = new Player(); // p.SetPosition(new Vector2(x, y)); // m_players.Add(p); //} var p = new Player(); p.SetPosition(new Vector2(400, 100)); p.SetPositionNext(new Vector2(400, 400)); m_players.Add(p); for (var i = 0; i < 10; i++) { var x = m_random.Next(0, 500); var y = m_random.Next(0, 500); var sx = m_random.Next(10, 50); var sy = m_random.Next(10, 50); m_walls.Add(new Segment() { P1 = new Vector2(x, y), P2 = new Vector2(x + sx, y), Color = new Vector4(0.5f, 0.2f, 0, 1) }); m_walls.Add(new Segment() { P1 = new Vector2(x + sx, y), P2 = new Vector2(x + sx, y + sy), Color = new Vector4(0.5f, 0.2f, 0, 1) }); m_walls.Add(new Segment() { P1 = new Vector2(x + sx, y + sy), P2 = new Vector2(x, y + sy), Color = new Vector4(0.5f, 0.2f, 0, 1) }); m_walls.Add(new Segment() { P1 = new Vector2(x, y + sy), P2 = new Vector2(x, y), Color = new Vector4(0.5f, 0.2f, 0, 1) }); } //m_walls.Add(new Segment() //{ // P1 = new Vector3(300, 300, 0), // P2 = new Vector3(300, 400, 0), // Color = new Vector4(0.5f, 0.2f, 0, 1) //}); //m_walls.Add(new Segment() //{ // P1 = new Vector3(300, 400, 0), // P2 = new Vector3(400, 400, 0), // Color = new Vector4(0.5f, 0.2f, 0, 1) //}); //m_walls.Add(new Segment() //{ // P1 = new Vector3(400, 400, 0), // P2 = new Vector3(400, 300, 0), // Color = new Vector4(0.5f, 0.2f, 0, 1) //}); //m_walls.Add(new Segment() //{ // P1 = new Vector3(400, 300, 0), // P2 = new Vector3(300, 300, 0), // Color = new Vector4(0.5f, 0.2f, 0, 1) //}); s_instance = this; //Triangles(); m_time = Time.Instance; m_time.AddAction(new Granite.Time.Action(Update, 0.1)); //m_time.AddAction(new Granite.Time.Action(UpdatePlayers, 2)); m_time.Start(); }
public Renderer(RenderSurface surface) { looper = new ParallelLooper(); Surface = surface; using (var stream = GetType().Assembly.GetManifestResourceStream("DemoRenderer.DemoRenderer.shaderarchive")) { ShaderCache = ShaderCache.Load(stream); } pool = new BufferPool(); Shapes = new ShapesExtractor(Surface.Device, looper, pool); SphereRenderer = new RayTracedRenderer <SphereInstance>(surface.Device, ShaderCache, @"ShapeDrawing\RenderSpheres.hlsl"); CapsuleRenderer = new RayTracedRenderer <CapsuleInstance>(surface.Device, ShaderCache, @"ShapeDrawing\RenderCapsules.hlsl"); BoxRenderer = new BoxRenderer(surface.Device, ShaderCache); TriangleRenderer = new TriangleRenderer(surface.Device, ShaderCache); MeshRenderer = new MeshRenderer(surface.Device, Shapes.MeshCache, ShaderCache); Lines = new LineExtractor(pool, looper); LineRenderer = new LineRenderer(surface.Device, ShaderCache); Background = new BackgroundRenderer(surface.Device, ShaderCache); CompressToSwap = new CompressToSwap(surface.Device, ShaderCache); GlyphRenderer = new GlyphRenderer(surface.Device, surface.Context, ShaderCache); TextBatcher = new TextBatcher(); UILineRenderer = new UILineRenderer(surface.Device, ShaderCache); UILineBatcher = new UILineBatcher(); OnResize(); var rasterizerStateDescription = RasterizerStateDescription.Default(); rasterizerStateDescription.IsFrontCounterClockwise = true; rasterizerStateDescription.CullMode = CullMode.Back; rasterizerState = new RasterizerState(Surface.Device, rasterizerStateDescription); rasterizerState.DebugName = "Default Rasterizer State"; var opaqueDepthStencilDescription = new DepthStencilStateDescription { IsDepthEnabled = true, DepthWriteMask = DepthWriteMask.All, //Note depth reversal. DepthComparison = Comparison.Greater, IsStencilEnabled = false }; opaqueDepthState = new DepthStencilState(Surface.Device, opaqueDepthStencilDescription); opaqueDepthState.DebugName = "Opaque Depth State"; var opaqueBlendStateDescription = BlendStateDescription.Default(); opaqueBlendState = new BlendState(Surface.Device, opaqueBlendStateDescription); opaqueBlendState.DebugName = "Opaque Blend State"; var a2cBlendStateDescription = BlendStateDescription.Default(); a2cBlendStateDescription.AlphaToCoverageEnable = true; a2cBlendState = new BlendState(Surface.Device, a2cBlendStateDescription); a2cBlendState.DebugName = "A2C Blend State"; var uiDepthStateDescription = new DepthStencilStateDescription { IsDepthEnabled = false, DepthWriteMask = DepthWriteMask.Zero, //Note depth reversal. DepthComparison = Comparison.Greater, IsStencilEnabled = false }; uiDepthState = new DepthStencilState(Surface.Device, uiDepthStateDescription); uiDepthState.DebugName = "UI Depth State"; //The UI will use premultiplied alpha. var uiBlendStateDescription = BlendStateDescription.Default(); uiBlendStateDescription.RenderTarget[0].IsBlendEnabled = true; uiBlendStateDescription.RenderTarget[0].SourceBlend = BlendOption.One; uiBlendStateDescription.RenderTarget[0].SourceAlphaBlend = BlendOption.One; uiBlendStateDescription.RenderTarget[0].DestinationBlend = BlendOption.InverseSourceAlpha; uiBlendStateDescription.RenderTarget[0].DestinationAlphaBlend = BlendOption.InverseSourceAlpha; uiBlendStateDescription.RenderTarget[0].BlendOperation = BlendOperation.Add; uiBlendStateDescription.RenderTarget[0].AlphaBlendOperation = BlendOperation.Add; uiBlendStateDescription.RenderTarget[0].RenderTargetWriteMask = ColorWriteMaskFlags.All; uiBlendState = new BlendState(Surface.Device, uiBlendStateDescription); uiBlendState.DebugName = "UI Blend State"; }