Testo 1929 Visite) DirectX 11
Per chi si avvicina alle DirectX11 la prima sensazione è la mancanza di molte utility. Lo sviluppo di sistemi di rendering è ormai talmente vario che è impossibile creare un unico sistema per caricare modelli 3D, gestire animazioni etc.
Una delle prime funzionalità di cui si sente subito la mancanza è il rendering di testo, una funzionalità da sempre supportata tramite utility create da Microsoft (le vecchie D3DX). Questa funzionalità era abbastanza limitata ma permetteva, con 2 righe di codice, di scrivere a video informazioni. In realtà sotto era presente un complesso meccanismo che generava mappe di caratteri da posizionare a video.
Contemporaneamente a Direct3D10 è nato però Direct2D, un’API molto semplice e lineare per fare grafica 2D. Per chi è pratico di sviluppo client (Windows Form) non è altro che una trasposizione delle GDI ma gestite dalle schede video anziché dal processore.
Nella versione Direct3D10 e Direct3D11.1 è possibile connettere queste due API in modo da delegare a Direct2D il rendering di sprite e testi.
Importate la libreria Direct2D1
Innanzitutto dobbiamo dire al Device che dovrà essere compatibile con Direct2D. Creiamo il Device utilizzando questa opzione come DeviceCreationFlags
DeviceCreationFlags flag = DeviceCreationFlags.None | DeviceCreationFlags.BgraSupport;
Una volta inizializzato il Device prendiamo il backbuffer
var backBufferTexture = SwapChain.GetBackBuffer<Texture2D>(0);
Ora abbiamo la texture college al backbuffer.
Creiamo ora l’oggetto base delle Direct2D
SharpDX.Direct2D1.RenderTarget _direct2DRenderTarget;
ed inizializziamolo
var d2dFactory = new SharpDX.Direct2D1.Factory();
var d2dSurface = backBuffer.QueryInterface<Surface>();
_direct2DRenderTarget = new SharpDX.Direct2D1.RenderTarget(
d2dFactory, d2dSurface,
new SharpDX.Direct2D1.RenderTargetProperties(new SharpDX.Direct2D1.PixelFormat(Format.Unknown, SharpDX.Direct2D1.AlphaMode.Premultiplied))
);
d2dSurface.Dispose();
d2dFactory.Dispose();
Abbiamo creato il nostro oggetto RenderTarget per Direct2D e possiamo utilizzarlo per disegnare ciò che vogliamo.
Creiamo ad esempio gli oggetti necessari per disegnare testo.
SharpDX.DirectWrite.TextFormat _directWriteTextFormat;
SharpDX.Direct2D1.SolidColorBrush _directWriteFontColor;
Ed inizializziamoli
var directWriteFactory = new SharpDX.DirectWrite.Factory();
_directWriteTextFormat = new SharpDX.DirectWrite.TextFormat(directWriteFactory, _”Calibri”, 14) {
TextAlignment = SharpDX.DirectWrite.TextAlignment.Leading, ParagraphAlignment = SharpDX.DirectWrite.ParagraphAlignment.Near
};
_directWriteFontColor = new SharpDX.Direct2D1.SolidColorBrush(_direct2DRenderTarget, Color.White);
directWriteFactory.Dispose();
All’interno del nostro ciclo di rendering sarà sufficiente creare un blocco di questo tipo
_direct2DRenderTarget.BeginDraw();
_direct2DRenderTarget.DrawText(text, _directWriteTextFormat, new RawRectangleF(x, y, width, height), _directWriteFontColor);
_direct2DRenderTarget.EndDraw();
Tra BeginDraw ed EndDraw potete disegnare tutto ciò che vi serve. Per disegnare un rettangolo, all’interno del blocco aggiungete
_direct2DRenderTarget.FillRectangle(new RawRectangleF(x, y, width, height), _directWriteFontColor);
I comandi sono molto intuitive, non dovreste avere problem ad utilizzare Direct2D per ogni vostra esigenza.
Attenzione: in fase di resize del device distruggete tutti gli oggetti creati con Direct2D prima di fare il resize o DirectX vi darà errore.
Potete trovare l'esempio all'interno degli esempi sul mio repository