Di RobyDx (del 29/07/2007 @ 08:33:01, in DirectX9, linkato 1910 volte)
Nonostante la potenza dell'hardware aumenti di anno in anno sembra non sia mai sufficiente il numero di poligoni da renderizzare. Infatti anche se le moderne schede video promettono di gestire centinaia di milioni di poligoni al secondo, in realtà questo numero scende drasticamente senza oppurtune ottimizzazioni. Il problema si manifesta soprattutto quando occorre mandare a schermo tantissimi oggetti separatamente.
Una scena molto complessa viene di solito renderizzata con pochi passaggi cercando di raggruppare i poligoni in modo da fare meno rendering possibili. In genere il motore grafico raggruppa tutti gli elementi con le stesse caratteristiche, li fonde insieme ed effettua il draw di molti vertici contemporaneamente (tecnica di batching). Al contrario non è possibile renderizzare insieme poligoni dinamici perchè la posizione dei vertici cambia continuamente e di conseguenza o si modificano i vertici nel vertexbuffer per ogni frame o si fa il draw separatamente per ognuno. Entrambe le soluzioni uccidono il frame rate. Un simile problema era già stato riscontrato per i point sprite, i sistemi particellari. Occorreva renderizzare tante immagini, ad esempio delle scintille, e non si poteva fare il draw per centinaia o migliaia di sprite. DirectX introdusse quindi un sistema che permettesse di gestire tanti sprite semplicemente come un array di punti ottimizzando moltissimo le prestazioni.
Il geometry instancing è qualcosa di simile ma applicato a modelli interamente 3D. Attraverso il device è possibile caricare un modello 3D e moltiplicarlo sullo schermo dando ad ognuna di queste copie caratteristiche specifiche di posizione, colore o qualsiasi altra cosa vogliate; il tutto accellerato dall'hardware.
Unica nota dolente è che solo le schede video con tecnologia shader 3.0 implementano tale caratteristica e sarà quindi necessario aspettare ancora un pò prima di vedere tale tecnologia sfruttata appieno....
Di RobyDx (del 29/07/2007 @ 08:39:33, in DirectX9, linkato 2322 volte)
Il rendering delle ombre è sicuramente uno degli aspetti più complessi da analizzare. In attesa che directX gestisca in maniera automatica questo problema vi propongo un nuovo metodo, alternativo allo stencil: lo shadow mapping.
Il presupposto da cui partire è la definizione di ombra. Un ombra è una schermatura tra tutto quello che si trova tra la luce e l'oggetto. Lo shadow mapping si basa su questo: renderizzare su una texture quello che si trova tra la luce e l'oggetto. L'oggetto ombreggiato semplicemente userà questa texture per creare zone d'ombra....
Di RobyDx (del 29/07/2007 @ 08:45:25, in DirectX9, linkato 2118 volte)
Lo shadow mapping si basa su un concetto semplice ma geniale. Osservate l'immagine:
La scena viene renderizzata su una texture inquadrando la scena dalla telecamera. Il pixel shader restituisce per ogni pixel la sua distanza dalla luce. La matrice world_view_projection usata per renderizzare questa scena viene salvata ed utilizzata durante il rendering della scena. Moltiplicando la posizione del vertice per questa motrice si ottiene infatti la posizione del vertice come se fosse inquadrato dalla luce....
Di RobyDx (del 01/08/2007 @ 11:07:52, in DirectX9, linkato 1273 volte)
Come spiegato nei tutorial di base di Direct3D i triangoli vengono visualizzati solo se disegnari in senso orario. La cosa può essere cambiata (se ad esempio si usa una riflessione l'ordine dei punti viene invertito). Occorre usare la proprietà cullmode del device e cambiarla prima del rendering che vi interessa.
Di RobyDx (del 01/08/2007 @ 11:08:45, in DirectX9, linkato 1299 volte)
Le figure sono normalmente viste come solidi con facce piene. Per creare alcuni simpatici effetti potete cambiare prima di ogni rendering come riempire le figure impostanto
device.RenderState.FillMode
Uguale ad uno di questi valori.
FillMode.Solid
Standard di default corrisponde a figure piene.
FillMode.Point
Si vedranno solo i vertici del solido
FillMode.WireFrame
Letteralmente "fil di ferro" permette di vedere solo le linee che compongono i triangoli.
Di RobyDx (del 01/08/2007 @ 11:10:28, in DirectX9, linkato 1776 volte)
Il viewport è un oggetto che se passato al device permette di specificare una zona dello schermo di cui rappresentare una scena. Tutta la grafica verrà disegnata all'interno della zona rettangolare specificata. Questo significa che la grafica 3D verrà rimpicciolita all'interno del rettangolo ma quella 2D (sprite e texture) dovrà essere proporzionate e posizionata per bene (altrimenti zone della grafica 2D verranno tagliate)....
Di RobyDx (del 02/08/2007 @ 08:30:18, in DirectX9, linkato 1583 volte)
La luce speculare è in pratica il riflesso metallico che alcuni oggetti emanano. L'esempio tipico è quello dell'auto che nonostante sia di un colore (ad esempio rosso) ha dei riflessi bianchi sotto la luce del sole. Impostare la luce speculare risulta quindi fondamentale per oggetti metallici (specie se unito ad altri effetti di riflessione dell'immagine).
Esempio di teiera con specular light da sinistra a destra: effetto disattivato, con sharpness a 10, con sharpness a 25....
Di RobyDx (del 02/08/2007 @ 08:32:44, in DirectX9, linkato 1662 volte)
Può risultare utile a volte salvare le texture su file, specie se sono il risultato di un rendering su texture o di un trattamento particolare della stessa. Salvare una texture è molto semplice e non richiede la creazione di nessun oggetto....
Di RobyDx (del 02/08/2007 @ 08:34:22, in DirectX9, linkato 1221 volte)
Quante volte può essere utile salvare in una immagine lo schermo del vostro gioco (tipo le foto che si vedono sulle recensioni dei giochi sulle riviste)? Di sicuro molte volte. Potete quindi o usare i tasti (stamp+ctrl) e poi copiare sul paint (molti non conoscono questo banale trucco per copiare l'immagine corrente dello schermo) o meglio ancora agire in modo più professionale e cioè farlo fare a directX.
Basta semplicemente prendere il backbuffer (che è una superficie) e salvarla.