\\ Home : Articoli : Stampa
Enumerazioni
Di RobyDx (del 15/01/2007 @ 20:59:26, in DirectX9, linkato 3018 volte)

L’enumerazione è la cosa che all’apparenza è la meno importante e noiosa ma in realtà è fondamentale per realizzare applicazioni (e quindi giochi) da distribuire. Si può dire che ogni mese esce un nuovo modello di scheda video con quelle bellissime locandine tipo “supporto per effetto pinco pallino” o “ora anche con motore super mega ecc.. ecc..”. A parte gli scherzi le schede man mano che escono non migliorano solo in potenza e in quantità di memoria ma anche nelle caratteristiche. Per chi realizza programmi grafici o giochi significa avere disponibilità o meno per determinati effetti. Sapere cosa posso fare è sicuramente fondamentale per poter inserire effetti più o meno complessi. Dobbiamo quindi imparare ad estrarre queste informazioni direttamente dalla scheda video. Qualcuno potrebbe aggiungere che sarebbe sufficiente un programma che ci enumera le caratteristiche della nostra scheda ma non è così. Immaginate di creare un gioco in cui inserite un certo effetto: e se quell’effetto non è supportato da chi lo usa? In questo caso sarà direttamente il gioco ad intervenire riducendo o eliminando quell’effetto in modo che continui a funzionare. DirectX offre una serie di oggetti per l’enumerazione talmente ricchi di informazione che ci vorrebbe un tutorial di 100 pagine per descriverne ognuno. In questo tutorial vi insegnerò come ricevere le informazioni più importanti e su come avere le altre. Per questo tutorial non è necessario creare un device e quindi non creeremo alcun schermo in finestra o fullscreen. Sarà sufficiente aggiungere il riferimento a DirectX, Direct3D e Direct3DX dal menù aggiungi riferimenti.

L’oggetto manager

L’oggetto responsabile della cattura delle informazioni è l’oggetti manager. Non c’è bisogno di dichiararlo, se userete imports per DirectX e Direct3D potrete usarlo direttamente.

Informazioni sulla scheda video

Le informazioni sulla scheda video sono contenute nell oggetto adapterInformation. Dichiarate un oggetto e ponetelo uguale a manager.Adapters(0). Ora tramite scheda potrete conoscere le prime info.

Dim scheda As AdapterInformation = Manager.Adapters(0)

Ad esempio questa funzione restituisce nome e versione del driver della vostra scheda

scheda.Information.Description

scheda.Information ha molti campi e ad occhio potete capire cosa restituisce ognuno (Driver name, Driver version si capisce abbastanza).

Calcolo risoluzioni

Il calcolo delle risoluzioni è uno degli usi più comuni. Tramite manager è infatti possibile conoscere tutte le risoluzioni che il PC può visualizzare sullo schermo. Dichiarate una variabile come questa

Dim risoluzioni As DisplayModeEnumerator
risoluzioni = scheda.SupportedDisplayModes()

in risoluzioni c’è ora un elenco di modalità video. Per leggerle occorre un oggetto

Dim schermo As DisplayModeCollection

Ed effettuare un ciclo

Dim i As Integer
For i = 0 To risoluzioni.Count
    risoluzioni.MoveNext()
    schermo = risoluzioni.Current() ‘da schermo estraete le informazioni
Next

In ogni ciclo schermo conterrà una delle modalità che si differenziano per alcune caratteristiche
Width e Heigth: larghezza e altezza della modalità
Format: colore della risoluzione, di solito Format.X8R8G8B8 per il 32Bit mode e Format.R5G6B5 per il 16 bit mode
Frequency: frequenza del monitor che può essere settata durante l’inizializzazione.
Di solito l’elenco è molto lungo. Se l’elenco è vuoto potreste non avere supporto per DirectX9.
In particolare potete verificare una modalitàdi colore tramite questa istruzione

Manager.CheckDeviceType(0, DeviceType.Hardware, Format.X8R8G8B8, Format.X8R8G8B8, False)

Qui controlliamo se il colore e la modalità è compatibile. Nel mio caso 32Bit di formato, accellerazione hardware e modalità non in finestra (fullscreen). La funzione restituisce un boolean.
Potete verificare anche il supporto per il depth buffer tramite

Manager.CheckDepthStencilMatch(0, DeviceType.Hardware, Format.X8R8G8B8, Format.X8R8G8B8, DepthFormat.D16)

In questo caso controlliamo se una superficie (il backbuffer è una superficie) supporta una risoluzione ed uno specifico depth buffer. Nel mio caso 16bit di depth con 32 bit di colore.

Abilità della scheda

Le abilità di una scheda riguardano formati per texture, superfici ed altri oggetti ed effetti supportati.
Per sapere ad esempio se un determinato formato texture è supportato vedere se è vera questa

Manager.CheckDeviceFormat(0, DeviceType.Hardware, Format.R5G6B5, Usage.WriteOnly, ResourceType.Textures, DepthFormat.D16)

Ora passiamo all’elenco più lungo.
La maggior parte delle caratteristiche sono inserite in un oggetto chiamato caps

Dim caps As Caps
caps = Manager.GetDeviceCaps(0, DeviceType.Hardware)

Ora caps ha una montagna di caratterestiche che state freschi se ve le spiego tutte. Non disperate, la maggior parte si intuisce da sola e spesso spiegherò ogni ruolo al momento che ci servirà. Inoltre sulla SDK della microsoft vi è un elenco dettagliato di ognuna. Ognuna delle proprietà è un intero, una stringa o un insieme di proprietà. Lavorate di puntini e potrete vedere tutta la struttura.
Ad esempio caps.MaxSimultaneousTextures è il numero massimo di texture visualizzabili o
caps.TextureFilterCaps.SupportsMinifyLinear indica se è compatibile il filtro lineare per le texture.
Vi lascio ad un programmino che vi enumera alcune caratteristiche della scheda. Per un insieme completo delle caratteristiche esiste un programma di utilities all’interno della SDK microsoft che enumera tutte le caps.
Fate pratica.

Esempio in VB.Net

Esempio C# .Net 2.0