\\ Home : Articoli : Stampa
Superfici
Di robydx (del 24/01/2007 @ 20:59:43, in DirectX9, linkato 2059 volte)

Le superfici in Direct3D potrebbero quasi definirsi un argomento di base dato che compare in molti contesti. Una superficie è una oggetto che rappresenta una zona di memoria in cui è contenuta una immagine. Una superficie si trova dietro ad ogni elemento di Direct3D dato che il backbuffer, lo Z buffer, il front buffer ed addirittura le texture non sono altro che superfici specializzate. Una superficie può lavorare però anche da sola diventanto una specie di sprite ed essere utilizzata per i processi di copia ed incolla di immagini (simili a quelli che si utilizzano in DirectDraw ma meno efficienti). La cosa si presta molto per titoli o per tenere in memoria determinate situazioni (come ad esempio preparare una superficie ed utilizzarla). Ci sono moltissimi modi per creare una superficie, il migliore e più semplice è questo.

Dim s As surface
s = device.CreateOffscreenPlainSurface(640, 480, Format.X8R8G8B8, Pool.Default) SurfaceLoader.FromFile(s, filesrc, Filter.None, 0)

Dichiaro una superficie, la creo tramite il device impostando i parametri ed infine uso l'oggetto surface loader per caricarla da file. Attenzione: per le dimensioni non importa ma il formato deve essere uguale a quello del backbuffer.
Filesrc è il percorso della immagine, filter è il filtro da usare in fase di caricamento mentre lo 0 in fondo è il colore chiave ossia quello che sarà trasparente. Potete usare ad esempio Color.White.ToArgb per generare un intero da un colore.
Pool è simile a quanto spiegato per le texture.
Per copiare una parte di una superficie su di un'altra si usa questa istruzione.

device.StretchRectangle(s, r1, s2, r2, TextureFilter.None)

S e S1 sono due superfici mentre r1 e r2 sono 2 rettangoli che specificano le zone da e dove si copia (Attenzione: heigth e width vengono interpretati come coordinate del punto basso destra del rettangolo non come larghezza). Il filtro serve per migliorare la visualizzazione (per le superfici è però preferibile usare il none per non generare errori).
Il punto dove con maggiore probabilità vorrete copiare una superficie è lo schermo ossia sul backbuffer. Occorre quindi generare la superficie del backbuffer.

Dim backB As Surface
backB = device.GetBackBuffer(0, 0, BackBufferType.Mono)

Ora non vi resta che usare stretchRectangle per copiare la superficie sul backbuffer (o viceversa).
Utilizzando bene i rettangoli potrete rimpicciolire l'immagine o ingrandirla.
Ecco l'esempio.

Esempio