Il mipmapping è una sistema di gestione delle texture basato sull'utilizzo di numerose texture per uno stesso oggetto ma che differiscono tra loro solo per la dimensione. Se ci avviciniamo ad un oggetto infatti possiamo notare che una texture di dimensioni non sufficienti appare priva di definizione e quindi poco gradevole. Contemporaneamente però texture troppo definite per oggetti distanti sono solo un grande spreco di risorse. La soluzione è quindi creare numerose copie della texture in questione cambiandole a secondo della distanza. Questa soluzione fu usata manualmente già nei primi giochi 3D: directX è in grado di gestire tutto ciò tramite il MipMapping generando automaticamente una texture contenente tutte le mappe.
Codice
t = TextureLoader.FromFile(device, AppPath() & "\texture0.bmp", 256, 256, 8,...
Nell'istruzione che vedete ho caricato da file una immagine. Notate che ho semplicemente cambiato il numero di mipLevels. In questo modo la texture creata avrà 8 texture. La creazione della texture divide per 2 ogni dimensione del livello sottostante. Quindi la prima texture avrà dimensione 256, la seconda 128, la terza 64 e così via. Calcolate bene il livello affinchè questa non scenda sotto a 1. In questo modo l'immagine verrà caricata in tutti i livelli della texture (quindi 8 volte) ma ogni volta con dimensione differente.
Un secondo modo è quello di creare la texture vuota
t = New Texture(device, 256, 256, 4, 0, Format.X8R8G8B8, Pool.Managed)
In questo esempio creo una texture con 4 livelli di mipmapping. Con l'accesso diretto alla memoria potete accedere al livello desiderato e inserire direttamente i pixel.
dest = CType(t.LockRectangle(GetType(Byte), 1, 0, pitch, 128 * 128 * 4), Byte())
Il numero 1 specifica il secondo livello di mipmapping (il primo è 0). Come vedete ho tenuto conto del fatto che il secondo livello ha profondità 128 se partiamo da 256.
L'ultimo sistema è quello di caricare una immagine già preparata. Le texture infatti possono essere salvate una volta preparate (da codice o tramite alcuni tools tra cui texture tool di microsoft). Caricatele normalmente.
Per attivare l'effetto dovete impostare il filtro di mipmapping per la texture selezionata.
device.SamplerState(0).MipFilter = TextureFilter.Linear
per la texture 0 ho specificato che le texture si alterneranno in modo lineare. Questo significa che non ci sarà un cambio secco tra le texture ma un passaggio graduale fra le stesse. Le texture si alterneranno a seconda della distanza a cui si trova l'oggetto. Altri settaggi sono
device.SamplerState(0).MipMapLevelOfDetailBias 'per il livello di dettaglio
device.SamplerState(0).MaxMipLevel 'per il massimo livello da usare.
Ora a seconda della distanza si alterneranno le texture. Questo sta alla base del suo secondo utilizzo. Se caricate immagini differenti sulla texture di ogni livello potrete creare effetti molto interessanti (ad esempio potrete caricare diverse immagini dell'acqua per fare in modo che si veda il fondo a seconda della distanza) anche se l'utilizzo principale è quello di alleggerire il programma evitando di usare texture definite per oggetti lontani. questo comunque comporterà una richiesta di memoria maggiore (circa il doppio se fate i conti).
Potete usare il mipmapping anche per texture cubiche e volumetriche e per il multitexturing.
Vi lascio all'esempio:
Esempio VB.Net
I commenti sono disabilitati.