Condividi tramite


Mapping dell'ambiente cubico (Direct3D 9)

Le mappe dell'ambiente cubico, talvolta definite mappe cubi, sono trame che contengono dati di immagine che rappresentano la scena che circonda un oggetto, come se l'oggetto fosse al centro di un cubo. Ogni faccia della mappa dell'ambiente cubico copre un campo di visualizzazione a 90 gradi nella mappa orizzontale e verticale e sono presenti sei facce per mappa cubo. L'orientamento dei visi è illustrato nella figura seguente.

illustration of a cube with central coordinate axes perpendicular to cube faces

Ogni faccia del cubo è orientata perpendicolare al piano x/y, y/z o x/z nello spazio globale. La figura seguente mostra come ogni piano corrisponde a un viso.

illustration of cube faces with coordinate projections from planes

Le mappe dell'ambiente cubico vengono implementate come una serie di oggetti trama. Le applicazioni possono usare immagini statiche per il mapping dell'ambiente cubico oppure eseguire il rendering nei visi della mappa del cubo per eseguire il mapping di ambiente dinamico. Questa tecnica richiede che le superfici della mappa del cubo siano superfici di destinazione di rendering valide, create con il set di flag D3DUSAGE_RENDERTARGET.

I visi di una mappa del cubo non devono contenere rendering estremamente dettagliati della scena circostante. Nella maggior parte dei casi, le mappe dell'ambiente vengono applicate alle superfici curve. Data la quantità di curvatura utilizzata dalla maggior parte delle applicazioni, la distorsione riflettente risultante rende dettagli estremi nella mappa dell'ambiente sprecato in termini di memoria e sovraccarico di rendering.

Ambiente cubico mipmapped Mappe

Le mappe del cubo possono essere mipmapped. Per creare una mappa del cubo mipmapped, impostare il parametro Levels del metodo CreateCubeTexture sul numero di livelli desiderati. È possibile immaginare la topografia di queste superfici come illustrato nel diagramma seguente.

diagram of a mipmapped cube map with n mip levels

Le applicazioni che creano mappe di ambiente cubico mipmapped possono accedere a ogni viso chiamando il metodo GetCubeMapSurface. Per iniziare, impostare il valore appropriato dal tipo enumerato D3DCUBEMAP_FACES, come descritto in Creazione di superfici mappa ambiente cubico (Direct3D 9). Selezionare quindi il livello da recuperare impostando il parametro di livello GetCubeMapSurface sul livello mipmap desiderato. Tenere presente che 0 corrisponde all'immagine di primo livello.

Coordinate delle trame per l'ambiente cubico Mappe

Le coordinate di trama che indicizzano una mappa di ambiente cubica non sono semplici coordinate di stile u, v, come usato quando vengono applicate trame standard. Infatti, le mappe dell'ambiente cubico non usano affatto le coordinate delle trame. Al posto di un set di coordinate di trama, le mappe dell'ambiente cubico richiedono un vettore 3D. È necessario prestare attenzione a specificare un formato di vertice appropriato. Oltre a indicare al sistema il numero di set di coordinate delle trame usate dall'applicazione, è necessario fornire informazioni sul numero di elementi in ogni set. Direct3D offre il set di macro D3DFVF_TEXCOORDSIZEN per questo scopo. Queste macro accettano un singolo parametro, identificando l'indice del set di coordinate della trama per cui vengono descritte le dimensioni. Nel caso di un vettore 3D, si include il modello di bit creato dalla macro D3DFVF_TEXCOORDSIZE3. Nell'esempio di codice seguente viene illustrato come viene usata questa macro.

// Create a flexible vertex format descriptor for a vertex that contains
//   a position, normal, and one set of 3D texture coordinates.

DWORD dwFVF = D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_TEX1 | D3DFVF_TEXCOORDSIZE3(0); 

In alcuni casi, ad esempio il mapping di luce diffusa, si usa la normale normale del vertice dello spazio della fotocamera per il vettore. In altri casi, ad esempio il mapping dell'ambiente speculare, si usa un vettore di reflection. Poiché le normali vertici trasformate sono ampiamente comprensibili, le informazioni qui si concentrano sul calcolo di un vettore di reflection.

Il calcolo di un vettore di reflection in modo autonomo richiede la comprensione della posizione di ogni vertice e di un vettore dal punto di vista al vertice. Direct3D può calcolare automaticamente i vettori di reflection per la geometria. L'uso di questa funzionalità consente di risparmiare memoria perché non è necessario includere le coordinate delle trame per la mappa dell'ambiente. Riduce anche la larghezza di banda e, nel caso di un dispositivo T&L HAL, può essere notevolmente più veloce rispetto ai calcoli che l'applicazione può effettuare autonomamente. Per usare questa funzionalità, nella fase di trama che contiene la mappa dell'ambiente cubico, impostare lo stato della fase di trama D3DTSS_TEXCOORDINDEX su una combinazione del membro D3DTSS_TCI_CAMERASPACEREFLECTIONVECTOR di D3DTEXTURESTAGESTATETYPE e dell'indice di un set di coordinate della trama. In alcune situazioni, ad esempio il mapping di luce diffusa, è possibile usare il membro D3DTSS_TCI_CAMERASPACENORMAL di D3DTEXTURESTAGESTATETYPE, che fa sì che il sistema usi la normale del vertice trasformato, dello spazio della fotocamera, come vettore di indirizzamento per la trama. L'indice viene usato solo dal sistema per determinare la modalità di wrapping per la trama.

Nell'esempio di codice seguente viene illustrato come viene usato questo valore.

// The m_d3dDevice variable is a valid pointer
// to an IDirect3DDevice9 interface.

// Automatically generate texture coordinates for stage 2.
// This assumes that stage 2 is assigned a cube map.
// Use the wrap mode from the texture coordinate set at index 1.

m_d3dDevice->SetTextureStageState( 2, D3DTSS_TEXCOORDINDEX,
                                   D3DTSS_TCI_CAMERASPACEREFLECTIONVECTOR | 1); 

Quando si abilita la generazione automatica delle coordinate delle trame, il sistema usa una delle due formule per calcolare il vettore di reflection per ogni vertice. Quando lo stato di rendering D3DRS_LOCALVIEWER è impostato su TRUE, viene usata la formula seguente.

formula of the reflection vector (r = 2(exn)n-e)

Nella formula precedente, R è il vettore di reflection da calcolare, E è il vettore normalizzato da posizione a occhio e N è il vertice dello spazio della fotocamera normale.

Quando lo stato di rendering D3DRS_LOCALVIEWER è impostato su FAL edizione Standard, il sistema usa la formula seguente.

formula of the reflection vector (r = 2nzn-i)

Gli elementi R e N in questa formula sono identici alla formula precedente. L'elemento NZ è lo spazio globale z del vertice normale, e io è il vettore (0,0,1) di un punto di vista infinitamente distante. Il sistema usa il vettore di reflection di una formula per selezionare e indirizzare la faccia appropriata della mappa del cubo.

Nota

Nella maggior parte dei casi, le applicazioni devono abilitare la normalizzazione automatica delle normali dei vertici. A tale scopo, impostare D3DRS_NORMALIZENORMALS su TRUE. Se non si abilita questo stato di rendering, l'aspetto della mappa dell'ambiente sarà drasticamente diverso da quello previsto.

 

Altre informazioni sono contenute nell'argomento seguente.

Mapping dell'ambiente