Home Page Twitter Facebook Feed RSS
NotJustCode
Apri

Enumerazione 2420 Visite) DirectX 11

Una delle principali difficoltà nello sviluppo di applicativi e giochi 3D è il doversi confrontare con un numero di configurazioni pressoché infinite. Con ogni nuova versione di Direct3D vengono introdotte caratteristiche che richiedono nuove schede video. Di conseguenza se si vuole che il proprio gioco sfrutti le nuove caratteristiche Direct3D ma allo stesso tempo sia compatibile con i vecchi hardware bisogna interrogare la scheda video ed abilitare o disabilitare funzionalità in base a questa.

Fino alla versione 9 le schede si differenziavano in tantissimi particolari e nessuna caratteristica poteva essere data per scontata. Con la versione 10 invece è stato dato un set di caratteristiche specifiche da dover rispettare. In questo modo una scheda o supportava Direct3D10 in tutte le sue caratteristiche o non lo supportava affatto. Con la versione 11 la cosa è stata ulteriormente migliorata ed ora esistono 6 configurazioni che prendono il nome di FeatureLevel

  • Level9_1
  • Level9_2
  • Level9_3
  • Level10
  • Level10_1
  • Level11
  • Level11_1

Le FeatureLevel 9 permettono di utilizzare DirectX11 anche su hardware DirectX9 seppur fortemente limitate. L’ help contenuto nella SDK contiene una tabella con le caratteristiche che ogni versione supporta. Utilizzare una caratteristica non valida per la propria FeatureLevel restituirà un errore. Durante l’inizializzazione di Direct3D sarà inoltre possibile indicare quale versione utilizzare in modo da poter verificare le funzionalità anche su hardware inferiori a quello su cui si sviluppa.

Il comando SharpDX.Direct3D11.Device.GetSupportedFeatureLevel() restituisce il livello supportato dalla scheda corrente

Ci sono comunque altre caratteristiche che si devono controllare. La prima è il conteggio delle schede video in quanto in un computer possono esserne presenti diverse oppure una sola scheda ad identificarsi in più modi. A sua volta ogni scheda video può avere una o più uscite ed ogni uscita può supportare un certo numero di risoluzioni.

Questo viene fatto dal Framework DGXI, indipendente dalla versione di Direct3D. Innanzittutto è sufficiente creare un oggetto Factory e poi interrogarlo

Factory factory = new Factory();

La proprietà Adapters contiene l’elenco delle schede video presenti sul sistema. L’oggetto Adapter contiene tutte le informazioni necessarie all’interno della struttura Description tra cui il nome, la quantità di memoria etc.

Passando un adapter al metodo GetSupportedFeatureLevel sarà possibile conoscerne il FeatureLevel.

L’oggetto Adapter a sua volta è in grado di restituire un elenco degli Adapter collegati ad esso. Se quindi il vostro PC è collegato a 2 monitor e ad un televisore otterrete informazioni per tutti questi dispositivi.

factory.Adapters[I].Outputs

Dove i è il numero della scheda da controllare. L’oggetto Output contiene le informazioni sul dispositivo di output e a sua volta permette di restituire le risoluzioni supportate. La maggior parte dei monitor è in grado infatti di supportare diverse risoluzioni ed il metodo

factory.Adapters[I].Outputs[J].GetDisplayModeList(Format.R8G8B8A8_UNorm, DisplayModeEnumerationFlags.Scaling);

I parametri passati al metodo sono il format di colore (32Bit, standard per la maggior parte dei dispositive) e la modalità di Scaling.

Ogni oggetto ModeDescription contenuto nell’array restituito conterrà la risoluzione (larghezza ed altezza in pixel), il formato e la frequenza. Quest’ultima va calcolata

desc.RefreshRate.Numerator / desc.RefreshRate.Denominator

Vi rimando al tutorial numero 1 della serie (Github o in fondo dal primo tutorial)