Mappage de l’environnement cubique (Direct3D 9)

Les cartes d’environnement cubiques , parfois appelées cartes de cube, sont des textures qui contiennent des données d’image représentant la scène entourant un objet, comme si l’objet se trouvait au centre d’un cube. Chaque face de la carte d’environnement cubique couvre un champ de vue de 90 degrés dans l’horizontal et le vertical, et il existe six visages par carte de cube. L’orientation des visages est illustrée dans l’illustration suivante.

illustration d’un cube avec des axes de coordonnées centrales perpendiculaires aux faces du cube

Chaque face du cube est orientée perpendiculairement au plan x/y, y/z ou x/z, dans l’espace du monde. L’illustration suivante montre comment chaque plan correspond à un visage.

illustration de visages de cube avec des projections de coordonnées à partir de plans

Les mappages d’environnement cubiques sont implémentés sous la forme d’une série d’objets de texture. Les applications peuvent utiliser des images statiques pour le mappage d’environnement cubique, ou elles peuvent s’afficher dans les visages de la carte de cube pour effectuer un mappage d’environnement dynamique. Cette technique nécessite que les surfaces de la carte de cube soient des surfaces de cible de rendu valides, créées avec l’indicateur D3DUSAGE_RENDERTARGET défini.

Les visages d’une carte de cube n’ont pas besoin de contenir des rendus extrêmement détaillés de la scène environnante. Dans la plupart des cas, les cartes d’environnement sont appliquées aux surfaces courbes. Compte tenu de la quantité de courbure utilisée par la plupart des applications, la distorsion de réflexion qui en résulte entraîne un gaspillage de détails extrêmes dans la carte de l’environnement en termes de mémoire et de surcharge de rendu.

Mappages d’environnement cubique mipmapped

Les cartes de cube peuvent être mipmappées. Pour créer une carte de cube mipmapped, définissez le paramètre Levels de la méthode CreateCubeTexture sur le nombre de niveaux souhaités. Vous pouvez imaginer la topographie de ces surfaces, comme illustré dans le diagramme suivant.

diagramme d’une carte de cube mipmapped avec n niveaux mip

Les applications qui créent des cartes d’environnement cubiques mipmapped peuvent accéder à chaque visage en appelant la méthode GetCubeMapSurface . Commencez par définir la valeur appropriée à partir du type énuméré D3DCUBEMAP_FACES, comme indiqué dans Création de surfaces cartographiques d’environnement cubiques (Direct3D 9). Ensuite, sélectionnez le niveau à récupérer en définissant le paramètre de niveau GetCubeMapSurface sur le niveau mipmap souhaité. N’oubliez pas que 0 correspond à l’image de niveau supérieur.

Coordonnées de texture pour les mappages d’environnement cubiques

Les coordonnées de texture qui indexent une carte d’environnement cubique ne sont pas de simples coordonnées de style u, v, comme elles sont utilisées lorsque des textures standard sont appliquées. En fait, les cartes d’environnement cubiques n’utilisent pas du tout de coordonnées de texture. À la place d’un ensemble de coordonnées de texture, les cartes d’environnement cubiques nécessitent un vecteur 3D. Vous devez veiller à spécifier un format de vertex approprié. En plus d’indiquer au système le nombre d’ensembles de coordonnées de texture que votre application utilise, vous devez fournir des informations sur le nombre d’éléments dans chaque ensemble. Direct3D offre le D3DFVF_TEXCOORDSIZEN jeu de macros à cet effet. Ces macros acceptent un paramètre unique, identifiant l’index de l’ensemble de coordonnées de texture pour lequel la taille est décrite. Dans le cas d’un vecteur 3D, vous incluez le modèle de bits créé par la macro D3DFVF_TEXCOORDSIZE3. L’exemple de code suivant montre comment cette macro est utilisée.

// Create a flexible vertex format descriptor for a vertex that contains
//   a position, normal, and one set of 3D texture coordinates.

DWORD dwFVF = D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_TEX1 | D3DFVF_TEXCOORDSIZE3(0); 

Dans certains cas, comme le mappage de la lumière diffuse, vous utilisez le vertex de l’espace caméra normal pour le vecteur. Dans d’autres cas, comme le mappage d’environnement spéculaire, vous utilisez un vecteur de réflexion. Étant donné que les normales de vertex transformées sont largement comprises, les informations se concentrent ici sur le calcul d’un vecteur de réflexion.

Le calcul d’un vecteur de réflexion vous-même nécessite de comprendre la position de chaque sommet et d’un vecteur du point de vue vers ce sommet. Direct3D peut calculer automatiquement les vecteurs de réflexion pour votre géométrie. L’utilisation de cette fonctionnalité permet d’économiser de la mémoire, car vous n’avez pas besoin d’inclure des coordonnées de texture pour la carte d’environnement. Il réduit également la bande passante et, dans le cas d’un appareil HAL LT&, il peut être beaucoup plus rapide que les calculs que votre application peut effectuer par elle-même. Pour utiliser cette fonctionnalité, dans l’étape de texture qui contient la carte d’environnement cubique, définissez l’état de la D3DTSS_TEXCOORDINDEX étape de texture sur une combinaison du membre D3DTSS_TCI_CAMERASPACEREFLECTIONVECTOR de D3DTEXTURESTAGESTATETYPE et de l’index d’un jeu de coordonnées de texture. Dans certaines situations, comme le mappage de lumière diffuse, vous pouvez utiliser le D3DTSS_TCI_CAMERASPACENORMAL membre de D3DTEXTURESTAGESTATETYPE, ce qui oblige le système à utiliser la normale de vertex de l’espace caméra transformé comme vecteur d’adressage pour la texture. L’index est utilisé uniquement par le système pour déterminer le mode d’habillage de la texture.

L’exemple de code suivant montre comment cette valeur est utilisée.

// The m_d3dDevice variable is a valid pointer
// to an IDirect3DDevice9 interface.

// Automatically generate texture coordinates for stage 2.
// This assumes that stage 2 is assigned a cube map.
// Use the wrap mode from the texture coordinate set at index 1.

m_d3dDevice->SetTextureStageState( 2, D3DTSS_TEXCOORDINDEX,
                                   D3DTSS_TCI_CAMERASPACEREFLECTIONVECTOR | 1); 

Lorsque vous activez la génération automatique de coordonnées de texture, le système utilise l’une des deux formules pour calculer le vecteur de réflexion pour chaque sommet. Lorsque l’état de rendu D3DRS_LOCALVIEWER est défini sur TRUE, la formule suivante est utilisée.

formule du vecteur de réflexion (r = 2(exn)n-e)

Dans la formule précédente, R est le vecteur de réflexion en cours de calcul, E est le vecteur de position à l’œil normalisé et N le sommet de l’espace caméra normal.

Lorsque l’état de rendu D3DRS_LOCALVIEWER est défini sur FALSE, le système utilise la formule suivante.

formule du vecteur de réflexion (r = 2nzn-i)

Les éléments R et N de cette formule sont identiques à la formule précédente. L’élément NZ est le z de l’espace du monde de la normale de vertex, et I est le vecteur (0,0,1) d’un point de vue infiniment lointain. Le système utilise le vecteur de réflexion de l’une ou l’autre formule pour sélectionner et traiter la face appropriée de la carte de cube.

Notes

Dans la plupart des cas, les applications doivent activer la normalisation automatique des normales de vertex. Pour ce faire, définissez D3DRS_NORMALIZENORMALS sur TRUE. Si vous n’activez pas cet état de rendu, l’apparence de la carte d’environnement sera radicalement différente de ce à quoi vous pourriez vous attendre.

 

Des informations supplémentaires sont contenues dans la rubrique suivante.

Mappage d’environnement