Condividi tramite


Risorse trama volume (Direct3D 9)

Le trame dei volumi sono raccolte tridimensionali di pixel (texel) che possono essere usate per disegnare una primitiva bidimensionale, ad esempio un triangolo o una linea. Le coordinate della trama a tre elementi sono necessarie per ogni vertice di una primitiva che deve essere consistenza con un volume. Man mano che viene disegnata la primitiva, ogni pixel contenuto viene riempito con il valore di colore di un pixel all'interno del volume, in base alle regole analoghe al caso della trama bidimensionale. Il rendering dei volumi non viene eseguito direttamente perché non esistono primitive tridimensionali che possono essere disegnate con esse.

È possibile usare trame di volume per effetti speciali come nebbia patch, esplosioni e così via.

I volumi sono organizzati in sezioni e possono essere considerati come superfici 2D di larghezza x altezza in pila per rendere un volume di larghezza x altezza x profondità. Ogni sezione è una singola riga. I volumi possono avere livelli successivi in cui le dimensioni di ogni livello vengono troncate a metà delle dimensioni del livello precedente. Il diagramma seguente mostra l'aspetto di una trama del volume con più livelli.

diagramma di una trama di volume con rappresentazioni di cubi 8x2x4, 4x1x2 e 2x1x1

Creazione di una trama di volume

Gli esempi di codice seguenti illustrano i passaggi necessari per usare una trama del volume.

In primo luogo, specificare un tipo di vertice personalizzato con tre coordinate di trama per ogni vertice, come illustrato in questo esempio di codice.

struct VOLUMEVERTEX
{
    FLOAT x, y, z;
    DWORD color;
    FLOAT tu, tv, tw;
};

#define D3DFVF_VOLUMEVERTEX (D3DFVF_XYZ|D3DFVF_DIFFUSE|
                             D3DFVF_TEX1|D3DFVF_TEXCOORDSIZE3(0))

Compilare quindi i vertici con i dati.

VOLUMEVERTEX g_vVertices[4] =
{
    { 1.0f, 1.0f, 0.0f, 0xffffffff, 1.0f, 1.0f, 0.0f },
    {-1.0f, 1.0f, 0.0f, 0xffffffff, 0.0f, 1.0f, 0.0f },
    { 1.0f,-1.0f, 0.0f, 0xffffffff, 1.0f, 0.0f, 0.0f },
    {-1.0f,-1.0f, 0.0f, 0xffffffff, 0.0f, 0.0f, 0.0f }
};

Creare ora un buffer dei vertici e riempirlo con i dati dei vertici.

Il passaggio successivo consiste nell'usare il metodo IDirect3DDevice9::CreateVolumeTexture per creare una trama del volume, come illustrato in questo esempio di codice.

LPDIRECT3DVOLUMETEXTURE9 pVolumeTexture;
d3dDevice->CreateVolumeTexture( 8, 4, 4, 1, 0, D3DFMT_R8G8B8,D3DPOOL_MANAGED, 
                                &pVolumeTexture );

Prima di eseguire il rendering della primitiva, impostare la trama corrente sulla trama del volume creata in precedenza. L'esempio di codice seguente illustra l'intero processo di rendering per una striscia di triangoli.

if( SUCCEEDED( d3dDevice->BeginScene() ) )
{
    // Draw the quad, with the volume texture.
    d3dDevice->SetTexture( 0, pVolumeTexture );
    d3dDevice->SetFVF( D3DFVF_VOLUMEVERTEX );
    d3dDevice->SetStreamSource( 0, pVB, sizeof(VOLUMEVERTEX) );
    d3dDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP, 0, 2);

   // End the scene.
   d3dDevice->EndScene();
}

trame Direct3D