Partager via


Ressources de texture de volume (Direct3D 9)

Les textures de volume sont des collections tridimensionnelles de pixels (texels) qui peuvent être utilisées pour peindre une primitive à deux dimensions, telle qu’un triangle ou une ligne. Des coordonnées de texture à trois éléments sont requises pour chaque sommet d’une primitive qui doit être texturée avec un volume. À mesure que la primitive est dessinée, chaque pixel contenu est rempli avec la valeur de couleur d’un pixel dans le volume, conformément à des règles analogues à la casse de texture à deux dimensions. Les volumes ne sont pas rendus directement, car il n’y a pas de primitives tridimensionnelles qui peuvent être peintes avec elles.

Vous pouvez utiliser des textures de volume pour les effets spéciaux tels que le brouillard fragmenté, les explosions, etc.

Les volumes sont organisés en tranches et peuvent être considérés comme des surfaces 2D empilées pour faire une largeur x hauteur x profondeur volume. Chaque tranche est une seule ligne. Les volumes peuvent avoir des niveaux suivants dans lesquels les dimensions de chaque niveau sont tronquées à la moitié des dimensions du niveau précédent. Le diagramme suivant montre à quoi ressemble une texture de volume avec plusieurs niveaux.

diagramme d’une texture de volume avec des représentations de cube 8x2x4, 4x1x2 et 2x1x1

Création d’une texture de volume

Les exemples de code ci-dessous montrent les étapes requises pour utiliser une texture de volume.

Tout d’abord, spécifiez un type de vertex personnalisé qui a trois coordonnées de texture pour chaque sommet, comme indiqué dans cet exemple de code.

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

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

Ensuite, remplissez les sommets avec des données.

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

À présent, créez une mémoire tampon de vertex et remplissez-la avec les données des sommets.

L’étape suivante consiste à utiliser la méthode IDirect3DDevice9::CreateVolumeTexture pour créer une texture de volume, comme illustré dans cet exemple de code.

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

Avant de restituer la primitive, définissez la texture actuelle sur la texture de volume créée ci-dessus. L’exemple de code ci-dessous montre l’intégralité du processus de rendu pour une bande de triangles.

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 Textures