Di robydx (del 24/01/2007 @ 20:59:43, in DirectX9, linkato 2058 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.
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.