public Graphics() { RenderForm = new RenderForm("Apple & Cinnamon") { Width = (int)(Screen.PrimaryScreen.Bounds.Width * ScreenSizeScale), Height = (int)(Screen.PrimaryScreen.Bounds.Height * ScreenSizeScale), StartPosition = FormStartPosition.CenterScreen }; Device.CreateWithSwapChain(DriverType.Hardware, DeviceCreationFlags.BgraSupport, new SwapChainDescription { BufferCount = 1, ModeDescription = new ModeDescription(RenderForm.ClientSize.Width, RenderForm.ClientSize.Height, new Rational(60, 1), Format.R8G8B8A8_UNorm), IsWindowed = true, OutputHandle = RenderForm.Handle, SampleDescription = new SampleDescription(1, 0), SwapEffect = SwapEffect.Discard, Usage = Usage.RenderTargetOutput }, out var device, out var swapChain); Device = device; SwapChain = swapChain; D2dFactory = new Factory(); D2DeviceContext = new _d2d.DeviceContext3( new _d2d.Device3(new Factory().QueryInterface <_d2d.Factory4>(), device.QueryInterface <_dxgi.Device>()), DeviceContextOptions.None); D2DeviceContext.Target = D2DeviceContext.CreateBitmapRenderTarget(swapChain); SpriteBatch = new SpriteBatch(D2DeviceContext); SwapChain.GetParent <SharpDX.DXGI.Factory>().MakeWindowAssociation(RenderForm.Handle, WindowAssociationFlags.IgnoreAll); var backBuffer = FromSwapChain <Texture2D>(SwapChain, 0); RenderTargetView = new RenderTargetView(Device, backBuffer); RenderTarget2D = new RenderTarget(D2dFactory, backBuffer.QueryInterface <Surface>(), new RenderTargetProperties(new PixelFormat(Format.Unknown, AlphaMode.Premultiplied))); DepthStencilView = new DepthStencilView(Device, new Texture2D(Device, new Texture2DDescription { Format = Format.D32_Float_S8X24_UInt, ArraySize = 1, MipLevels = 1, Width = RenderForm.ClientSize.Width, Height = RenderForm.ClientSize.Height, SampleDescription = new SampleDescription(1, 0), Usage = ResourceUsage.Default, BindFlags = BindFlags.DepthStencil, CpuAccessFlags = CpuAccessFlags.None, OptionFlags = ResourceOptionFlags.None })); DirectWrite = new SharpDX.DirectWrite.Factory(); Device.ImmediateContext.Rasterizer.SetViewport(new Viewport(0, 0, RenderForm.ClientSize.Width, RenderForm.ClientSize.Height, 0.0f, 1.0f)); }
public static Bitmap1 CreateBitmapRenderTarget(this _d2d.DeviceContext3 d2dDeContext, SwapChain swapChain) { using var backBuffer = SharpDX.Direct3D11.Resource.FromSwapChain <Texture2D>(swapChain, 0); using var surface = backBuffer.QueryInterface <Surface>(); var bmpProperties = new BitmapProperties1( new SharpDX.Direct2D1.PixelFormat(Format.R8G8B8A8_UNorm, SharpDX.Direct2D1.AlphaMode.Premultiplied), dpiX: 96, dpiY: 96, bitmapOptions: BitmapOptions.Target | BitmapOptions.CannotDraw); return(new Bitmap1(d2dDeContext, surface, bmpProperties)); }
/// <summary> /// Initializes a new instance of the <see cref="SpriteBatch"/>. /// </summary> public SpriteBatch(DeviceContext3 context3) : this(IntPtr.Zero) { context3.CreateSpriteBatch(this); }
public void Run() { #region setup resources var mainForm = new RenderForm(); var scDescription = new SwapChainDescription() { BufferCount = 1, ModeDescription = new ModeDescription( 0, 0, new Rational(60, 1), Format.R8G8B8A8_UNorm), IsWindowed = true, OutputHandle = mainForm.Handle, SampleDescription = new SampleDescription(1, 0), SwapEffect = SwapEffect.Discard, Usage = Usage.RenderTargetOutput }; //DeviceCreationFlags.Debug flag below will show debug layer messages in your output window. //Need proper version of windows sdk for it to work, otherwise it will throw an exception. //You also need to right click your project->properties->debug (on the left panel)-> check "enable native code debugging" // Create Device and SwapChain _d3d11.Device.CreateWithSwapChain( DriverType.Hardware, DeviceCreationFlags.BgraSupport | DeviceCreationFlags.Debug, new[] { _d3d.FeatureLevel.Level_12_1 }, scDescription, out d3d11Device, out swapChain); // Ignore all windows events dxgiFactory = swapChain.GetParent <_dxgi.Factory1>(); dxgiFactory.MakeWindowAssociation(mainForm.Handle, WindowAssociationFlags.IgnoreAll); d2dFactory = new _d2d.Factory(); d2dFactory4 = d2dFactory.QueryInterface <_d2d.Factory4>(); dxgiDevice = d3d11Device.QueryInterface <_dxgi.Device>(); d2dDevice3 = new _d2d.Device3(d2dFactory4, dxgiDevice); d2dDeviceContext3 = new _d2d.DeviceContext3(d2dDevice3, DeviceContextOptions.None); #endregion #region create drawing input sourceImage = createD2DBitmap(@"yourFile.png", d2dDeviceContext3); spriteBatch = new SpriteBatch(d2dDeviceContext3); var destinationRects = new RawRectangleF[1]; destinationRects[0] = new RectangleF(100, 50, sourceImage.Size.Width, sourceImage.Size.Height); var sourceRects = new RawRectangle[1]; sourceRects[0] = new RectangleF(0, 0, sourceImage.Size.Width, sourceImage.Size.Height); #endregion #region mainLoop RenderLoop.Run(mainForm, () => { if (d2dTarget != null) { d2dTarget.Dispose(); d2dTarget = null; } using (var backBuffer = Texture2D.FromSwapChain <Texture2D>(swapChain, 0)) { using (var surface = backBuffer.QueryInterface <Surface>()) { var bmpProperties = new BitmapProperties1( new PixelFormat(Format.R8G8B8A8_UNorm, _d2d.AlphaMode.Premultiplied), dpiX: 96, dpiY: 96, bitmapOptions: BitmapOptions.Target | BitmapOptions.CannotDraw); d2dTarget = new Bitmap1( d2dDeviceContext3, surface, bmpProperties); d2dDeviceContext3.Target = d2dTarget; } } //the key missing piece: cannot use per primitive antialiasing with spritebatch d2dDeviceContext3.AntialiasMode = AntialiasMode.Aliased; d2dDeviceContext3.BeginDraw(); spriteBatch.Clear(); spriteBatch.AddSprites( 1, destinationRects, sourceRects, null, null, destinationRectanglesStride: 0, //0 stride because there is only 1 element sourceRectanglesStride: 0, colorsStride: 0, transformsStride: 0); d2dDeviceContext3.DrawSpriteBatch( spriteBatch: spriteBatch, startIndex: 0, spriteCount: 1, bitmap: sourceImage, interpolationMode: BitmapInterpolationMode.Linear, spriteOptions: SpriteOptions.ClampToSourceRectangle); d2dDeviceContext3.EndDraw(); //first param set to 1 would indicate waitVerticalBlanking swapChain.Present(0, PresentFlags.None); }); #endregion }