Di robydx (del 20/06/2007 @ 22:16:16, in Direct3D10, linkato 2560 volte)
Uno sprite è una immagine bidimensionale all'interno della scena, solitamente utilizzata per visualizzare menù (esempio la barra della vita nei giochi). In Direct3D lo sprite è un rettangolo 3D orientato permanentemente verso la telecamera e renderizzato in modo da superare depth test (il calcolo della profondità). Il risultato è un oggetto sempre in primo piano che dà l'aspetto di una immagine bidimensionale. La classe ID3DX10Sprite è un set di funzioni di utilità che gestiscono questo tipo di rendering.
Renderizzare tramite sprite permette di non doversi preoccupare di nulla, rendendo l'operazione estremamente semplice (simile a quanto visto per i font). A differenza di quanto avveniva in Direct3D9 è possibile renderizzare più sprite con una sola chiamata alla funzione. Un'altra differenza è che ora le coordinate sono in unità directX e non in pixel. Questo significa che uno sprite con dimensione 1 occupa 1/4 dello schermo che ha dimensione 2x2. Questo semplifica la vita per sprite che devono avere dimensione indipentente dalla risoluzione ma complica la vita quando si devono fare rendering precisi al pixel. In questo caso proporzioni ed un pò di matematica aiutano allo scopo.
L'inizializzazione dell'oggetto ID3DX10Sprite richiede semplicemente l'utilizzo del device
la variabile bufferSizeserve per indicare al controller il numero massimo di sprite che renderizzeremo (in modo da ottimizzarne la gestione).
Creata la variabile questa richiede l'attivazione tramite istruzione Begin. Tutti gli sprite andranno renderizzati tra l'istruzione Begin ed End dello sprite.
sprite->Begin(0);
//rendering
sprite->End();
Il parametro nel begin indica l'opzione di rendering degli sprite. Oltre a zero esistono
D3DX10_SPRITE_SORT_TEXTURE
D3DX10_SPRITE_SORT_DEPTH_BACK_TO_FRONT
D3DX10_SPRITE_SORT_DEPTH_FRONT_TO_BACK
Per ordinare le texture in fase di rendering (le ultime utilizzano la distanza zero come ZOrder).
A questo punto è possibile renderizzare gli sprite tra i due blocchi. Uno sprite è una immagine salvata in una texture2D di Direct3D10. Le stesse texture usate per i modelli possono essere usate anche per gli sprite.
Per renderizzare si utilizzano due istruzioni,
DrawSpritesImmediate
DrawSpritesBuffered
La seconda istruzione serve per il rendering di grandi quantità di sprite che vengono ottimizzati
L'istruzione DrawSpritesImmediate prende come input la definizione degli sprite (ossia un array che descrive caratteristiche degli sprite), il numero di sprite da renderizzare e due valori comunemente impostati a zero.
Questo è un esempio di struttura D3DX10_SPRITE per la descrizione di uno sprite.
Come vedete si passano vari parametri
matWorld: la matrice world usata per posizionare l'oggetto. L'asse di rotazione è l'asse Z
TexCoord: in coordinate texture la posizione di inizio della texture da visualizzare
TexSize: in coordinate texture la dimensione della texture da visualizzare
ColorModulate: un colore che viene moltiplicato per il colore dello sprite modificandolo
pTexture: il puntatore alla ResourceView contenente la texture. Può essere una texture2D o un array di texture2D
TextureIndex: nel caso di array di texture contiene l'indice della texture da usare, 0 per texture normali
L'istruzione buffered invece prende come parametri solo la descrizione degli sprite ed il numero di questi.
Per renderizzare sprite con porzioni trasparenti è necessario creare texture con valori di alpha pari a zero o ad uno. Questo permetterà di creare sprite con forma non quadrata.