Brouillard de vertex (Direct3D 9)
Lorsque le système effectue des foements de vertex, il applique des calculs de brouillard à chaque sommet d’un polygone, puis interpole les résultats sur le visage 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, l’application 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 vertex. Vous êtes libre d’utiliser les formules souhaitées : basée sur la plage, volumetrice ou autre. Direct3D utilise le facteur de brouillard fourni pour interpoler sur le visage de chaque polygone. Les applications qui effectuent leur propre transformation et éclairage doivent également effectuer leurs propres calculs de brouillard de vertex. Par conséquent, une telle application n’a besoin que d’activer le mélange de brouillard et de 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).
Note
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é du 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
Note
Direct3D utilise des calculs de brouillard basés sur des plages uniquement lors de l’utilisation du brouillard de vertex avec la transformation Direct3D et le moteur d’éclairage. Cela est dû au fait que le brouillard de pixels est implémenté dans le pilote de périphérique et qu’aucun matériel n’existe actuellement pour prendre en charge le brouillard basé sur une plage de pixels. Si votre application effectue sa propre transformation et son éclairage, elle doit effectuer ses propres calculs de brouillard, basés sur des plages ou dans le cas contraire.
Parfois, l’utilisation du brouillard peut introduire des artefacts graphiques qui provoquent la fusion 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 : un distant suffisant pour être affecté par le brouillard, et l’autre assez proche pour être non affecté. Si la zone d’affichage pivote en place, les effets de brouillard apparents peuvent changer, même si les objets sont stationnaires. Le diagramme suivant montre une vue en haut vers le bas de cette situation.
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 une plage, Direct3D utilise la distance réelle du point de vue à 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 dans la scène, ce qui évite 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 une plage est calculé par Direct3D pendant la transformation et l’éclairage. Les applications qui n’utilisent pas la transformation Direct3D et le moteur d’éclairage 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 vertex.
Utilisation du brouillard de vertex
Procédez comme suit pour activer le brouillard de vertex dans votre application.
- Activez le mélange de brouillard en définissant D3DRS_FOGENABLE sur TRUE.
- Définissez la couleur de brouillard dans l’état de rendu D3DRS_FOGCOLOR.
- Choisissez la formule de brouillard souhaitée en définissant l’état de rendu D3DRS_FOGVERTEXMODE sur un membre du type énuméré D3DFOGMODE.
- 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 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 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 avec succès les valeurs à virgule flottante à ces méthodes sans traduction de données en castant les adresses des variables à virgule flottante en tant que pointeurs DWORD, puis en les déreferencant.
Rubriques connexes