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 ID3DX10Sprite* sprite; HRESULT hr= D3DX10CreateSprite(device->GetDevice(),bufferSize,&this->sprite); 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. D3DX10_SPRITE spriteDesc; spriteDesc.ColorModulate=D3DXCOLOR(1,1,1,1); spriteDesc.matWorld=mat1; spriteDesc.pTexture=tex->GetResource(); spriteDesc.TexCoord=D3DXVECTOR2(x,y); spriteDesc.TexSize=D3DXVECTOR2(width,height); spriteDesc.TextureIndex=0; 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. Vi lascio al demo
|