Ressources de texture de volume (Direct3D 9)
Les textures de volume sont des collections à trois dimensions de pixels (texels) qui peuvent être utilisées pour peindre une primitive à deux dimensions, comme un triangle ou une ligne. Les coordonnées de texture à trois éléments sont requises pour chaque sommet d’une primitive à texturer 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 aux règles analogues à la casse de texture à deux dimensions. Les volumes ne sont pas rendus directement, car il n’existe pas de primitives tridimensionnelles qui peuvent être peintes avec elles.
Vous pouvez utiliser des textures de volume pour des effets spéciaux tels que le brouillard patchy, les explosions, etc.
Les volumes sont organisés en tranches et peuvent être considérés comme des surfaces de largeur x hauteur 2D empilées pour faire une largeur x hauteur x volume de profondeur. 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
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 vertex, comme illustré 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 rendre la primitive, définissez la texture actuelle sur la texture du volume créée ci-dessus. L’exemple de code ci-dessous montre l’intégralité du processus de rendu d’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();
}
Rubriques connexes