Brouillard de pixels (Direct3D 9)

Le brouillard de pixels tire son nom du fait qu’il est calculé sur une base par pixel dans le pilote de périphérique. Cela est différent du brouillard de vertex, qui est calculé par le pipeline pendant les calculs de transformation et d’éclairage. Le brouillard de pixels est parfois appelé brouillard de table, car certains pilotes utilisent une table de recherche précalculée pour déterminer le facteur de brouillard, en utilisant la profondeur de chaque pixel à appliquer dans les calculs de fusion. Il peut être appliqué à l’aide de n’importe quelle formule de brouillard identifiée par les membres du type énuméré D3DFOGMODE . Les implémentations de ces formules sont spécifiques au pilote. Si un pilote ne prend pas en charge une formule de brouillard complexe, elle doit se dégrader en formule moins complexe.

profondeur basée sur Eye-Relative ou Z

Pour atténuer les artefacts graphiques liés au brouillard causés par une distribution inégale des valeurs z dans une mémoire tampon de profondeur, la plupart des appareils matériels utilisent la profondeur relative des yeux au lieu des valeurs de profondeur basées sur z pour le brouillard de pixels. La profondeur relative oculaire est essentiellement l’élément w d’un ensemble de coordonnées homogènes. Microsoft Direct3D prend la réciproque de l’élément RHW à partir d’un ensemble de coordonnées d’espace d’appareil pour reproduire true w. Si un appareil prend en charge le brouillard relatif aux yeux, il définit l’indicateur D3DPRASTERCAPS_WFOG dans le membre RasterCaps de la structure D3DCAPS9 lorsque vous appelez la méthode IDirect3DDevice9::GetDeviceCaps . À l’exception du rastériseur de référence, les appareils logiciels utilisent toujours z pour calculer les effets de brouillard de pixels.

Lorsque le brouillard relatif aux yeux est pris en charge, le système utilise automatiquement la profondeur relative des yeux plutôt que la profondeur basée sur z si la matrice de projection fournie produit des valeurs z dans l’espace mondial qui sont équivalentes à des valeurs w dans l’espace de l’appareil. Vous définissez la matrice de projection en appelant la méthode IDirect3DDevice9::SetTransform , en utilisant la valeur D3DTS_PROJECTION et en passant une structure D3DMATRIX qui représente la matrice souhaitée. Si la matrice de projection n’est pas conforme à cette exigence, les effets de brouillard ne sont pas appliqués correctement. Pour plus d’informations sur la production d’une matrice conforme, consultez Transformation de projection (Direct3D 9).

Direct3D utilise la matrice de projection actuellement définie dans ses calculs de profondeur basés sur w. Par conséquent, une application doit définir une matrice de projection conforme pour recevoir les fonctionnalités w souhaitées, même si elle n’utilise pas le pipeline de transformation Direct3D.

Direct3D vérifie la quatrième colonne de la matrice de projection. Si les coefficients sont [0,0,0,1] (pour une projection affine), le système utilise des valeurs de profondeur basées sur z pour le brouillard. Dans ce cas, vous devez également spécifier les distances de début et de fin pour les effets de brouillard linéaire dans l’espace de l’appareil, qui varient de 0,0 au point le plus proche de l’utilisateur et de 1,0 au point le plus éloigné.

Utilisation du brouillard de pixels

Utilisez les étapes suivantes pour activer le brouillard de pixels dans votre application.

  1. Activez le mélange de brouillard en définissant l’état de rendu du D3DRS_FOGENABLE sur TRUE.
  2. Définissez la couleur de brouillard souhaitée dans l’état de rendu D3DRS_FOGCOLOR.
  3. Choisissez la formule de brouillard à utiliser en définissant l’état de rendu D3DRS_FOGTABLEMODE sur le membre correspondant du type énuméré D3DFOGMODE .
  4. Définissez les paramètres de brouillard comme vous le souhaitez pour le mode de brouillard sélectionné dans les états de rendu associés. Cela inclut les distances de début et de fin pour le brouillard linéaire, et la densité du brouillard pour le mode brouillard exponentiel.

L’exemple suivant montre à quoi ces étapes peuvent ressembler dans le code.

// For brevity, error values in this example are not checked 
//   after each call. A real-world application should check 
//   these values appropriately.
//
// For the purposes of this example, g_pDevice is a valid
//   pointer to an IDirect3DDevice9 interface.
void SetupPixelFog(DWORD Color, DWORD Mode)
{
    float Start   = 0.5f;    // For linear mode
    float End     = 0.8f;
    float Density = 0.66f;   // For exponential modes
 
    // Enable fog blending.
    g_pDevice->SetRenderState(D3DRS_FOGENABLE, TRUE);
 
    // Set the fog color.
    g_pDevice->SetRenderState(D3DRS_FOGCOLOR, Color);
    
    // Set fog parameters.
    if( Mode == D3DFOG_LINEAR )
    {
        g_pDevice->SetRenderState(D3DRS_FOGTABLEMODE, Mode);
        g_pDevice->SetRenderState(D3DRS_FOGSTART, *(DWORD *)(&Start));
        g_pDevice->SetRenderState(D3DRS_FOGEND,   *(DWORD *)(&End));
    }
    else
    {
        g_pDevice->SetRenderState(D3DRS_FOGTABLEMODE, Mode);
        g_pDevice->SetRenderState(D3DRS_FOGDENSITY, *(DWORD *)(&Density));
    }

Certains paramètres de brouillard sont requis en tant que valeurs à virgule flottante, même si la méthode IDirect3DDevice9::SetRenderState accepte uniquement les valeurs DWORD dans le deuxième paramètre. L’exemple précédent fournit les valeurs à virgule flottante à IDirect3DDevice9::SetRenderState sans traduction de données en castant les adresses des variables à virgule flottante en tant que pointeurs DWORD, puis en les déréférent.

Types de brouillard