Condividi tramite


Risorse trama volume (Direct3D 9)

Le trame del volume 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 tramata con un volume. Poiché la primitiva viene disegnata, ogni pixel contenuto viene riempito con il valore di colore di alcuni pixel all'interno del volume, in base alle regole simili al caso di trama bidimensionale. I volumi non vengono visualizzati direttamente perché non sono presenti primitive tridimensionali che possono essere dipinte con loro.

È possibile usare trame di volume per effetti speciali, ad esempio nebbia patchy, esplosione e così via.

I volumi sono organizzati in sezioni e possono essere considerati come superfici di larghezza x altezza 2D 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 come sembra una trama del volume con più livelli.

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

Creazione di una trama del volume

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

Specificare innanzitutto 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 dai 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 mostra 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