Brouillard de pixels (Direct3D 9)
Le brouillard de pixels obtient son nom du fait qu’il est calculé sur une base par pixel dans le pilote de périphérique. Cela diffère 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. Elle peut être appliquée à 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, il doit se dégrader en formule moins complexe.
Eye-Relative par rapport à la profondeur basée sur Z
Pour atténuer les artefacts graphiques liés au brouillard provoqués par une distribution inégale des valeurs z dans une mémoire tampon de profondeur, la plupart des périphériques matériels utilisent une profondeur relative oculaire au lieu de valeurs de profondeur basées sur z pour le brouillard de pixels. La profondeur relative de l’œil est essentiellement l’élément w d’un jeu de coordonnées homogène. Microsoft Direct3D accepte la réciproque de l’élément RHW à partir d’un jeu 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 z si la matrice de projection fournie produit des valeurs z dans l’espace mondial équivalent aux 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-based 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,0,1] (pour une projection affine), le système utilise des valeurs de profondeur 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éaires dans l’espace de l’appareil, qui vont de 0,0 au point le plus proche à l’utilisateur, et 1,0 au point le plus éloigné.
Utilisation du brouillard de pixels
Procédez comme suit pour activer le brouillard de pixels dans votre application.
- Activez le mélange de brouillard en définissant l’état de rendu D3DRS_FOGENABLE sur TRUE.
- Définissez la couleur de brouillard souhaitée dans l’état de rendu D3DRS_FOGCOLOR.
- Choisissez la formule de brouillard à utiliser en définissant l’état de rendu D3DRS_FOGTABLEMODE sur le membre correspondant du type énuméré D3DFOGMODE.
- 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 de brouillard exponentiel.
L’exemple suivant montre ce que 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 pour IDirect3DDevice9 ::SetRenderState sans traduction de données en cas de conversion des adresses des variables à virgule flottante en tant que pointeurs DWORD, puis en les déreferencant.
Rubriques connexes