Exemple #1
0
		public void Export(int sizeX, int sizeY, ID3D10Scene scene, Altaxo.Graph.Gdi.GraphExportOptions options, System.IO.Stream toStream)
		{
			var device = new Device(DriverType.Hardware, DeviceCreationFlags.BgraSupport | DeviceCreationFlags.Debug, FeatureLevel.Level_10_0);

			// try to get the highest MSAA level with the highest quality
			int sampleCount = 32;
			int qlevel_sampleCount = 0;

			for (; sampleCount >= 0; sampleCount /= 2)
			{
				if (0 != (qlevel_sampleCount = device.CheckMultisampleQualityLevels(Format.B8G8R8A8_UNorm, sampleCount))) // quality level for sample count
					break;
			}

			Texture2DDescription colordesc = new Texture2DDescription
			{
				BindFlags = BindFlags.RenderTarget | BindFlags.ShaderResource,
				Format = Format.B8G8R8A8_UNorm_SRgb,
				Width = sizeX,
				Height = sizeY,
				MipLevels = 1,
				SampleDescription = new SampleDescription(sampleCount, qlevel_sampleCount - 1),
				Usage = ResourceUsage.Default,
				OptionFlags = ResourceOptionFlags.Shared,
				CpuAccessFlags = CpuAccessFlags.None,
				ArraySize = 1
			};

			Texture2DDescription depthdesc = new Texture2DDescription
			{
				BindFlags = BindFlags.DepthStencil,
				Format = Format.D32_Float_S8X24_UInt,
				Width = sizeX,
				Height = sizeY,
				MipLevels = 1,
				SampleDescription = new SampleDescription(sampleCount, qlevel_sampleCount - 1),
				Usage = ResourceUsage.Default,
				OptionFlags = ResourceOptionFlags.None,
				CpuAccessFlags = CpuAccessFlags.None,
				ArraySize = 1,
			};

			var renderTarget = new Texture2D(device, colordesc);
			var depthStencil = new Texture2D(device, depthdesc);
			var renderTargetView = new RenderTargetView(device, renderTarget);
			var depthStencilView = new DepthStencilView(device, depthStencil);

			// Rendering

			device.OutputMerger.SetTargets(depthStencilView, renderTargetView);
			device.Rasterizer.SetViewports(new Viewport(0, 0, sizeX, sizeY, 0.0f, 1.0f));
			Color4 clearColor = new Color4(1, 1, 1, 0); // Transparent
			if (options.BackgroundBrush != null)
			{
				var axoColor = options.BackgroundBrush.Color.Color;
				clearColor = new Color4(axoColor.ScR, axoColor.ScG, axoColor.ScB, axoColor.ScA);
			}
			device.ClearRenderTargetView(renderTargetView, clearColor);
			device.ClearDepthStencilView(depthStencilView, DepthStencilClearFlags.Depth | DepthStencilClearFlags.Stencil, 1.0f, 0);

			scene.Attach(device, new PointD2D(sizeX, sizeY));
			scene.Render();

			device.Flush();

			Texture2D renderTarget2 = null;

			if (sampleCount > 1) // if renderTarget is an MSAA render target, we first have to copy it into a non-MSAA render target before we can copy it to a CPU texture and then hope to save it
			{
				// create a non-MSAA render target with the same size
				Texture2DDescription renderTarget2Description = new Texture2DDescription
				{
					BindFlags = BindFlags.RenderTarget | BindFlags.ShaderResource,
					Format = Format.B8G8R8A8_UNorm_SRgb,
					Width = sizeX,
					Height = sizeY,
					MipLevels = 1,
					SampleDescription = new SampleDescription(1, 0), // non MSAA
					Usage = ResourceUsage.Default,
					OptionFlags = ResourceOptionFlags.Shared,
					CpuAccessFlags = CpuAccessFlags.None,
					ArraySize = 1
				};

				renderTarget2 = new Texture2D(device, renderTarget2Description); // create non-MSAA render target
				device.ResolveSubresource(renderTarget, 0, renderTarget2, 0, renderTarget.Description.Format); // copy from MSAA render target to the non-MSAA render target

				var h = renderTarget; // exchange renderTarget with renderTarget2
				renderTarget = renderTarget2;
				renderTarget2 = h;
			}

			// renderTarget is now a non-MSAA renderTarget
			Texture2DExtensions.SaveToStream(renderTarget, options.ImageFormat, options.DestinationDpiResolution, toStream);

			scene.Detach();

			Disposer.RemoveAndDispose(ref depthStencilView);
			Disposer.RemoveAndDispose(ref renderTargetView);
			Disposer.RemoveAndDispose(ref renderTarget2);
			Disposer.RemoveAndDispose(ref renderTarget);
			Disposer.RemoveAndDispose(ref depthStencil);
			Disposer.RemoveAndDispose(ref device);
		}
Exemple #2
0
        public void Export(int sizeX, int sizeY, ID3D10Scene scene, Altaxo.Graph.Gdi.GraphExportOptions options, System.IO.Stream toStream)
        {
            Device           device           = null;
            Texture2D        renderTarget     = null;
            Texture2D        renderTarget2    = null;
            Texture2D        depthStencil     = null;
            RenderTargetView renderTargetView = null;
            DepthStencilView depthStencilView = null;

            try
            {
                //device = new Device(DriverType.Hardware, DeviceCreationFlags.BgraSupport, FeatureLevel.Level_10_0);
                device = D3D10DeviceFactory.Instance.BorrowDevice();
                // try to get the highest MSAA level with the highest quality
                int sampleCount        = 32;
                int qlevel_sampleCount = 0;

                for (; sampleCount >= 0; sampleCount /= 2)
                {
                    if (0 != (qlevel_sampleCount = device.CheckMultisampleQualityLevels(Format.B8G8R8A8_UNorm, sampleCount))) // quality level for sample count
                    {
                        break;
                    }
                }

                var colordesc = new Texture2DDescription
                {
                    BindFlags         = BindFlags.RenderTarget | BindFlags.ShaderResource,
                    Format            = Format.B8G8R8A8_UNorm_SRgb,
                    Width             = sizeX,
                    Height            = sizeY,
                    MipLevels         = 1,
                    SampleDescription = new SampleDescription(sampleCount, qlevel_sampleCount - 1),
                    Usage             = ResourceUsage.Default,
                    OptionFlags       = ResourceOptionFlags.Shared,
                    CpuAccessFlags    = CpuAccessFlags.None,
                    ArraySize         = 1
                };

                var depthdesc = new Texture2DDescription
                {
                    BindFlags         = BindFlags.DepthStencil,
                    Format            = Format.D32_Float_S8X24_UInt,
                    Width             = sizeX,
                    Height            = sizeY,
                    MipLevels         = 1,
                    SampleDescription = new SampleDescription(sampleCount, qlevel_sampleCount - 1),
                    Usage             = ResourceUsage.Default,
                    OptionFlags       = ResourceOptionFlags.None,
                    CpuAccessFlags    = CpuAccessFlags.None,
                    ArraySize         = 1,
                };

                renderTarget     = new Texture2D(device, colordesc);
                depthStencil     = new Texture2D(device, depthdesc);
                renderTargetView = new RenderTargetView(device, renderTarget);
                depthStencilView = new DepthStencilView(device, depthStencil);

                // Rendering

                device.OutputMerger.SetTargets(depthStencilView, renderTargetView);
                device.Rasterizer.SetViewports(new Viewport(0, 0, sizeX, sizeY, 0.0f, 1.0f));
                var clearColor = new Color4(1, 1, 1, 0); // Transparent
                if (options.BackgroundBrush != null)
                {
                    var axoColor = options.BackgroundBrush.Color.Color;
                    clearColor = new Color4(axoColor.ScR, axoColor.ScG, axoColor.ScB, axoColor.ScA);
                }
                device.ClearRenderTargetView(renderTargetView, clearColor);
                device.ClearDepthStencilView(depthStencilView, DepthStencilClearFlags.Depth | DepthStencilClearFlags.Stencil, 1.0f, 0);

                scene.Attach(device, new PointD2D(sizeX, sizeY));
                scene.Render();
                device.Flush();
                scene.Detach();

                if (sampleCount > 1) // if renderTarget is an MSAA render target, we first have to copy it into a non-MSAA render target before we can copy it to a CPU texture and then hope to save it
                {
                    // create a non-MSAA render target with the same size
                    var renderTarget2Description = new Texture2DDescription
                    {
                        BindFlags         = BindFlags.RenderTarget | BindFlags.ShaderResource,
                        Format            = Format.B8G8R8A8_UNorm_SRgb,
                        Width             = sizeX,
                        Height            = sizeY,
                        MipLevels         = 1,
                        SampleDescription = new SampleDescription(1, 0), // non MSAA
                        Usage             = ResourceUsage.Default,
                        OptionFlags       = ResourceOptionFlags.Shared,
                        CpuAccessFlags    = CpuAccessFlags.None,
                        ArraySize         = 1
                    };

                    renderTarget2 = new Texture2D(device, renderTarget2Description);                               // create non-MSAA render target
                    device.ResolveSubresource(renderTarget, 0, renderTarget2, 0, renderTarget.Description.Format); // copy from MSAA render target to the non-MSAA render target

                    var h = renderTarget;                                                                          // exchange renderTarget with renderTarget2
                    renderTarget  = renderTarget2;
                    renderTarget2 = h;
                }

                // renderTarget is now a non-MSAA renderTarget
                Texture2DExtensions.SaveToStream(renderTarget, options.ImageFormat, options.DestinationDpiResolution, toStream);
            }
            finally
            {
                Disposer.RemoveAndDispose(ref depthStencilView);
                Disposer.RemoveAndDispose(ref renderTargetView);
                Disposer.RemoveAndDispose(ref renderTarget2);
                Disposer.RemoveAndDispose(ref renderTarget);
                Disposer.RemoveAndDispose(ref depthStencil);

                device.ClearState();
                D3D10DeviceFactory.Instance.PassbackDevice(ref device);
                //device.QueryInterface<DeviceDebug>().ReportLiveDeviceObjects(ReportingLevel.Summary)
                // Disposer.RemoveAndDispose(ref device);
                //var activeObjects = SharpDX.Diagnostics.ObjectTracker.FindActiveObjects();
            }
        }