Partager via


Brouillard de vertex (Direct3D 9)

Lorsque le système effectue la buée de vertex, il applique des calculs de brouillard à chaque sommet d’un polygone, puis interpole les résultats sur la face du polygone pendant la rastérisation. Les effets de brouillard de vertex sont calculés par le moteur d’éclairage et de transformation Direct3D. Pour plus d’informations, consultez Paramètres de brouillard (Direct3D 9).

Si votre application n’utilise pas Direct3D pour la transformation et l’éclairage, elle doit effectuer des calculs de brouillard. Dans ce cas, placez le facteur de brouillard calculé dans le composant alpha de la couleur spéculaire pour chaque sommet. Vous êtes libre d’utiliser les formules de votre choix : par plage, volumétrique ou autre. Direct3D utilise le facteur de brouillard fourni pour interpoler sur la face de chaque polygone. Les applications qui effectuent leurs propres transformations et éclairages doivent également effectuer leurs propres calculs de brouillard de vertex. Par conséquent, une telle application doit uniquement activer le mélange de brouillard et définir la couleur de brouillard à travers les états de rendu associés, comme décrit dans Mélange de brouillard (Direct3D 9) et Couleur de brouillard (Direct3D 9) .

Notes

Lorsque vous utilisez un nuanceur de vertex, vous devez utiliser le brouillard de vertex. Pour ce faire, utilisez le nuanceur de vertex pour écrire l’intensité de brouillard par vertex dans le registre oFog. Une fois le nuanceur de pixels terminé, les données oFog sont utilisées pour interpoler linéairement avec la couleur de brouillard. Cette intensité n’est pas disponible dans un nuanceur de pixels.

 

brouillard Range-Based

Notes

Direct3D utilise des calculs de brouillard basés sur la plage uniquement lors de l’utilisation du brouillard de vertex avec le moteur de transformation et d’éclairage Direct3D. Cela est dû au fait que le brouillard de pixels est implémenté dans le pilote de périphérique et qu’il n’existe actuellement aucun matériel pour prendre en charge le brouillard basé sur la plage de pixels. Si votre application effectue sa propre transformation et éclairage, elle doit effectuer ses propres calculs de brouillard, basés sur la plage ou autre.

 

Parfois, l’utilisation du brouillard peut introduire des artefacts graphiques qui provoquent le mélange d’objets avec la couleur de brouillard de manière non intuitive. Par exemple, imaginez une scène dans laquelle il y a deux objets visibles : l’un suffisamment éloigné pour être affecté par le brouillard, et l’autre assez proche pour ne pas être affecté. Si la zone d’affichage pivote sur place, les effets de brouillard apparents peuvent changer, même si les objets sont stationnaires. Le diagramme suivant montre une vue de haut en bas d’une telle situation.

diagramme de deux points de vue et de la façon dont ils affectent le brouillard pour deux objets

Le brouillard basé sur la plage est un autre moyen, plus précis, de déterminer les effets du brouillard. Dans le brouillard basé sur la plage, Direct3D utilise la distance réelle entre le point de vue et un sommet pour ses calculs de brouillard. Direct3D augmente l’effet du brouillard à mesure que la distance entre les deux points augmente, plutôt que la profondeur du sommet à l’intérieur de la scène, évitant ainsi les artefacts de rotation.

Si l’appareil actuel prend en charge le brouillard basé sur la plage, il définit la valeur D3DPRASTERCAPS_FOGRANGE dans le membre RasterCaps de D3DCAPS9 lorsque vous appelez la méthode IDirect3DDevice9::GetDeviceCaps . Pour activer le brouillard basé sur la plage, définissez l’état de rendu D3DRS_RANGEFOGENABLE sur TRUE.

Le brouillard basé sur la plage est calculé par Direct3D pendant la transformation et l’éclairage. Les applications qui n’utilisent pas le moteur de transformation et d’éclairage Direct3D doivent également effectuer leurs propres calculs de brouillard de vertex. Dans ce cas, fournissez le facteur de brouillard basé sur la plage dans le composant alpha du composant spéculaire pour chaque sommet.

Utilisation du brouillard de vertex

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

  1. Activez le mélange de brouillard en définissant D3DRS_FOGENABLE sur TRUE.
  2. Définissez la couleur de brouillard dans l’état de rendu D3DRS_FOGCOLOR.
  3. Choisissez la formule de brouillard souhaitée en définissant l’état de rendu D3DRS_FOGVERTEXMODE sur un membre du type énuméré D3DFOGMODE .
  4. Définissez les paramètres de brouillard comme vous le souhaitez pour la formule de brouillard sélectionnée dans les états de rendu.

L’exemple suivant, écrit en C++, 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 SetupVertexFog(DWORD Color, DWORD Mode, BOOL UseRange, FLOAT Density)
{
    float Start = 0.5f,    // Linear fog distances
          End   = 0.8f;
 
    // Enable fog blending.
    g_pDevice->SetRenderState(D3DRS_FOGENABLE, TRUE);
 
    // Set the fog color.
    g_pDevice->SetRenderState(D3DRS_FOGCOLOR, Color);
    
    // Set fog parameters.
    if(D3DFOG_LINEAR == Mode)
    {
        g_pDevice->SetRenderState(D3DRS_FOGVERTEXMODE, Mode);
        g_pDevice->SetRenderState(D3DRS_FOGSTART, *(DWORD *)(&Start));
        g_pDevice->SetRenderState(D3DRS_FOGEND,   *(DWORD *)(&End));
    }
    else
    {
        g_pDevice->SetRenderState(D3DRS_FOGVERTEXMODE, Mode);
        g_pDevice->SetRenderState(D3DRS_FOGDENSITY, *(DWORD *)(&Density));
    }

    // Enable range-based fog if desired (only supported for
    //   vertex fog). For this example, it is assumed that UseRange
    //   is set to a nonzero value only if the driver exposes the 
    //   D3DPRASTERCAPS_FOGRANGE capability.
    // Note: This is slightly more performance intensive
    //   than non-range-based fog.
    if(UseRange)
        g_pDevice->SetRenderState(D3DRS_RANGEFOGENABLE, TRUE);
}

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. Cet exemple fournit correctement les valeurs à virgule flottante à ces méthodes sans traduction de données en cas de castage des adresses des variables à virgule flottante en tant que pointeurs DWORD, puis en les déréférençant.

Types de brouillard