Filtro delle trame con Mipmaps (Direct3D 9)
Un mipmap è una sequenza di trame, ognuna delle quali è una rappresentazione con risoluzione progressivamente inferiore della stessa immagine. L'altezza e la larghezza di ogni immagine, o livello, nella mipmap è una potenza di due dimensioni inferiori al livello precedente. Le mipmap non devono essere quadrate.
Un'immagine mipmap ad alta risoluzione viene usata per gli oggetti vicini all'utente. Le immagini a bassa risoluzione vengono usate come l'oggetto appare più lontano. Mipmapping migliora la qualità delle trame di cui è stato eseguito il rendering a scapito dell'uso di più memoria.
Direct3D rappresenta mipmap come catena di superfici associate. La trama con risoluzione più alta si trova all'inizio della catena e ha il livello successivo della mipmap come allegato. A sua volta, tale livello ha un allegato che corrisponde al livello successivo nella mipmap e così via, fino al livello di risoluzione più basso della mipmap.
Le illustrazioni seguenti illustrano un esempio di questi livelli. Le trame bitmap rappresentano un segno su un contenitore in un gioco di prima persona 3D. Quando viene creato come mipmap, la trama con risoluzione più alta è la prima nel set. Ogni trama riuscita nel set mipmap è inferiore in altezza e larghezza per una potenza di 2. In questo caso, la mipmap con risoluzione massima è di 256 pixel di 256 pixel. La trama successiva è 128x128. L'ultima trama della catena è 64x64.
Questo segno ha una distanza massima da cui è visibile. Se l'utente inizia lontano dal segno, il gioco visualizza la trama più piccola nella catena mipmap, che in questo caso la trama 64x64.
Man mano che l'utente sposta il punto di vista più vicino al segno, vengono usate trame con risoluzione progressivamente superiore nella catena mipmap. La risoluzione nella figura seguente è 128x128.
La trama con risoluzione più alta viene usata quando il punto di vista dell'utente è alla distanza minima consentita dal segno, come illustrato nella figura seguente.
Si tratta di un modo più efficiente per simulare la prospettiva per le trame. Anziché eseguire il rendering di una singola trama a molte risoluzioni, è più veloce usare più trame a risoluzioni variabili.
Direct3D può valutare quale trama in un set mipmap è la risoluzione più vicina all'output desiderato e può eseguire il mapping dei pixel nello spazio del texel. Se la risoluzione dell'immagine finale è compresa tra le risoluzioni delle trame nel set mipmap, Direct3D può esaminare i texel in mipmap e combinare i valori dei colori.
Per usare mipmap, l'applicazione deve compilare un set di mipmap. Le applicazioni applicano mipmap selezionando il set mipmap come prima trama nel set di trame correnti. Per altre informazioni, vedere Fusione di trame (Direct3D 9).For more information, see Texture Blending (Direct3D 9).
Successivamente, l'applicazione deve impostare il metodo di filtro usato da Direct3D per campionare i texel. Il metodo più rapido di filtro mipmap consiste nel fare in modo che Direct3D selezioni il texel più vicino. Usare il valore enumerato D3DTEXF_POINT per selezionare questa opzione. Direct3D può produrre risultati di filtro migliori se l'applicazione usa il valore enumerato D3DTEXF_LINEAR. In questo modo viene selezionata la mipmap più vicina e quindi viene calcolata una media ponderata dei texel che circondano la posizione nella trama in cui viene mappata il pixel corrente.
Le trame mipmap vengono usate in scene 3D per ridurre il tempo necessario per eseguire il rendering di una scena. Migliorano anche il realismo della scena. Tuttavia, spesso richiedono grandi quantità di memoria.
Creazione di un set di mipmap
L'esempio seguente mostra come l'applicazione può chiamare il metodo IDirect3DDevice9::CreateTexture per compilare una catena di cinque livelli mipmap: 256x256, 128x128, 64x64, 32x32 e 16x16.
// This code example assumes that m_d3dDevice is a
// valid pointer to a IDirect3DDevice9 interface
IDirect3DTexture9 * pMipMap;
m_pD3DDevice->CreateTexture(256, 256, 5, 0, D3DFMT_R8G8B8,
D3DPOOL_MANAGED, &pMipMap);
I primi due parametri accettati da IDirect3DDevice9::CreateTexture sono le dimensioni e la larghezza della trama di primo livello. Il terzo parametro specifica il numero di livelli nella trama. Se si imposta questo valore su zero, Direct3D crea una catena di superfici, ognuna di due dimensioni inferiori rispetto a quella precedente, fino alla dimensione più piccola possibile di 1x1. Il quarto parametro specifica l'utilizzo per questa risorsa; in questo caso, 0 viene specificato per indicare nessun utilizzo specifico per la risorsa. Il quinto parametro specifica il formato della superficie per la trama. Usare un valore del tipo enumerato D3DFORMAT per questo parametro. Il sesto parametro specifica un membro del tipo enumerato D3DPOOL che indica la classe di memoria in cui inserire la risorsa creata. A meno che non si usino trame dinamiche, è consigliabile D3DPOOL_MANAGED. Il parametro finale accetta l'indirizzo di un puntatore a un'interfaccia IDirect3DTexture9 .
Nota
Ogni superficie di una catena mipmap ha dimensioni di metà della superficie precedente nella catena. Se la mipmap di primo livello ha dimensioni pari a 256x128, le dimensioni del mipmap di secondo livello sono 128x64, il terzo livello è 64x32 e così via, fino a 1x1. Non è possibile richiedere un numero di livelli mipmap in Livelli che causerebbero la larghezza o l'altezza di qualsiasi mipmap nella catena per essere inferiore a 1. Nel caso semplice di una superficie mipmap di primo livello 4x2, il valore massimo consentito per Levels è tre. Le dimensioni di primo livello sono 4x2, le dimensioni di secondo livello sono 2x1 e le dimensioni per il terzo livello sono 1x1. Un valore maggiore di 3 in Levels restituisce un valore frazionario nell'altezza del mipmap di secondo livello e pertanto non è consentito.
Selezione e visualizzazione di un Mipmap
Chiamare il metodo IDirect3DDevice9::SetTexture per impostare la trama mipmap impostata come prima trama nell'elenco delle trame correnti. Per altre informazioni, vedere Fusione di trame (Direct3D 9).For more information, see Texture Blending (Direct3D 9).
Dopo aver selezionato il set di trame mipmap, l'applicazione deve assegnare valori dal tipo enumerato D3DTEXTUREFILTERTYPE allo stato del campionatore D3DSAMP_MIPFILTER. Direct3D esegue quindi automaticamente il filtro delle trame mipmap. L'abilitazione del filtro delle trame mipmap è illustrata nell'esempio di codice seguente.
m_pD3DDevice->SetTexture(0, pMipMap);
m_pD3DDevice->SetSamplerState(0, D3DSAMP_MIPFILTER, D3DTEXF_POINT);
L'applicazione può anche attraversare manualmente una catena di superfici mipmap usando il metodo IDirect3DTexture9::GetSurfaceLevel e specificando il livello mipmap da recuperare. Nell'esempio seguente viene attraversata una catena mipmap dalle risoluzioni più alte alle più basse.
IDirect3DSurface9 * pSurfaceLevel;
for (int iLevel = 0; iLevel < pMipMap->GetLevelCount(); iLevel++)
{
pMipMap->GetSurfaceLevel(iLevel, &pSurfaceLevel);
// Process this level
pSurfaceLevel->Release();
}
Le applicazioni devono attraversare manualmente una catena mipmap per caricare i dati bitmap in ogni superficie della catena. Questo è in genere l'unico motivo per attraversare la catena. Un'applicazione può recuperare il numero di livelli in un mipmap chiamando IDirect3DBaseTexture9::GetLevelCount.
Argomenti correlati