Home Page Twitter Facebook Feed RSS
NotJustCode
Apri

Testo 675 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