Dela via


Volymstrukturresurser (Direct3D 9)

Volymstrukturer är tredimensionella samlingar av pixlar (texels) som kan användas för att måla en tvådimensionell primitiv, till exempel en triangel eller en linje. Treelementskoordinater för struktur krävs för varje hörn av en primitiv som ska struktureras med en volym. När primitiven ritas fylls varje innesluten pixel med färgvärdet från någon pixel i volymen, i enlighet med regler som motsvarar det tvådimensionella texturfallet. Volymer återges inte direkt eftersom det inte finns några tredimensionella primitiver som kan målas med dem.

Du kan använda volymstrukturer för specialeffekter som ojämn dimma, explosioner och så vidare.

Volymer är ordnade i sektorer och kan betraktas som bredd x höjd 2D-ytor staplade för att göra en bredd x höjd x djupvolym. Varje sektor är en enskild rad. Volymer kan ha efterföljande nivåer där dimensionerna på varje nivå trunkeras till hälften av dimensionerna på föregående nivå. Följande diagram visar hur en volymstruktur med flera nivåer ser ut.

diagram över en volymstruktur med 8x2x4, 4x1x2 och 2x1x1 kubrepresentationer

Skapa en volymstruktur

Kodexemplen nedan visar de steg som krävs för att använda en volymstruktur.

Ange först en anpassad hörntyp som har tre strukturkoordinater för varje hörn, som du ser i det här kodexemplet.

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

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

Fyll sedan hörnen med data.

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 }
};

Skapa nu en brytpunktsbuffert och fyll den med data från hörnen.

Nästa steg är att använda metoden IDirect3DDevice9::CreateVolumeTexture för att skapa en volymstruktur, som du ser i det här kodexemplet.

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

Innan du återger primitiven anger du den aktuella strukturen till den volymstruktur som skapades ovan. Kodexemplet nedan visar hela återgivningsprocessen för en remsa med trianglar.

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();
}

Direct3D-texturer