Partager via


Utilisation du mappage de bosses (Direct3D 9)

Détection de la prise en charge du mappage de bosses

Un appareil peut effectuer un mappage de bosses s’il prend en charge l’opération de fusion de textures D3DTOP_BUMPENVMAP ou D3DTOP_BUMPENVMAPLUMINANCE. Utilisez IDirect3D9::CheckDeviceFormat avec D3DUSAGE_QUERY_LEGACYBUMPMAP pour voir si un format est pris en charge pour le mappage de bosses.

En outre, les applications doivent case activée les fonctionnalités de l’appareil pour s’assurer que l’appareil prend en charge un nombre approprié d’étapes de fusion, généralement au moins trois, et expose au moins un format de pixels de mappage de bosses.

L’exemple de code suivant vérifie les fonctionnalités de l’appareil pour détecter la prise en charge du mappage de bosses dans l’appareil actuel, à l’aide des critères donnés.

BOOL SupportsBumpMapping()
{
    D3DCAPS9 d3dCaps;

    d3dDevice->GetDeviceCaps( &d3dCaps );

    // Does this device support the two bump mapping blend operations?
    if ( 0 == d3dCaps.TextureOpCaps & ( D3DTEXOPCAPS_BUMPENVMAP |
                                            D3DTEXOPCAPS_BUMPENVMAPLUMINANCE ))
        return FALSE;

    // Does this device support up to three blending stages?
    if( d3dCaps.MaxTextureBlendStages < 3 )
        return FALSE;

    return TRUE;
}

Création d’une texture de carte de bosses

Vous créez une texture de mappage de bosses comme n’importe quelle autre texture. Votre application vérifie la prise en charge du mappage de bosses et récupère un format de pixel valide, comme indiqué dans Détection de la prise en charge du mappage de bosses.

Une fois la surface créée, vous pouvez charger chaque pixel avec les valeurs delta et la luminance appropriées, si le format de surface inclut la luminance. Les valeurs de chaque composant de pixel sont décrites dans Bump Map Pixel Formats (Direct3D 9).

Configuration des paramètres de mappage de bosses

Une fois que votre application a créé une carte de bosses et défini le contenu de chaque pixel, vous pouvez préparer le rendu en configurant les paramètres de mappage de bosses. Les paramètres de mappage de bosses incluent la définition des textures requises et de leurs opérations de fusion, ainsi que les contrôles de transformation et de luminance pour la carte de bosses elle-même.

  1. Définissez la carte de texture de base si elle est utilisée, le mappage de bosses et les textures de mappage d’environnement en phases de fusion de textures.
  2. Définissez les opérations de fusion de couleur et d’alpha pour chaque étape de texture.
  3. Définissez la matrice de transformation de carte de bosses.
  4. Définissez les valeurs d’échelle et de décalage de luminance en fonction des besoins.

L’exemple de code suivant définit trois textures (la carte de texture de base, la carte de bosses et une carte d’environnement spéculaire) aux étapes de fusion de texture appropriées.

// Set the three textures.
d3dDevice->SetTexture( 0, d3dBaseTexture );
d3dDevice->SetTexture( 1, d3dBumpMap );
d3dDevice->SetTexture( 2, d3dEnvMap );

Après avoir défini les textures sur leurs phases de fusion, l’exemple de code suivant prépare les opérations de fusion et les arguments pour chaque étape.

// Set the color operations and arguments to prepare for
//   bump mapping.

// Stage 0: The base texture
d3dDevice->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_MODULATE );
d3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
d3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_DIFFUSE );
d3dDevice->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1 );
d3dDevice->SetTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE ); 
d3dDevice->SetTextureStageState( 0, D3DTSS_TEXCOORDINDEX, 1 );

// Stage 1: The bump map - Use luminance for this example.
d3dDevice->SetTextureStageState( 1, D3DTSS_TEXCOORDINDEX, 1 );
d3dDevice->SetTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_BUMPENVMAPLUMINANCE);
d3dDevice->SetTextureStageState( 1, D3DTSS_COLORARG1, D3DTA_TEXTURE );
d3dDevice->SetTextureStageState( 1, D3DTSS_COLORARG2, D3DTA_CURRENT );

// Stage 2: A specular environment map
d3dDevice->SetTextureStageState( 2, D3DTSS_TEXCOORDINDEX, 0 );
d3dDevice->SetTextureStageState( 2, D3DTSS_COLOROP, D3DTOP_ADD );
d3dDevice->SetTextureStageState( 2, D3DTSS_COLORARG1, D3DTA_TEXTURE );
d3dDevice->SetTextureStageState( 2, D3DTSS_COLORARG2, D3DTA_CURRENT );

Lorsque les opérations de fusion et les arguments sont définis, l’exemple de code suivant définit la matrice de mappage de bosses 2x2 sur la matrice d’identité en définissant les D3DTSS_BUMPENVMAPMAT00 et les D3DTSS_BUMPENVMAPMAT11 membres de D3DTEXTURESTAGESTATETYPE sur 1.0. Si vous définissez la matrice sur l’identité, le système doit utiliser les valeurs delta dans le mappage de bosses sans modification, mais ce n’est pas une exigence.

// Set the bump mapping matrix.
//
// Note  These calls rely on the following inline shortcut function:
//   inline DWORD F2DW( FLOAT f ) { return *((DWORD*)&f); }
d3dDevice->SetTextureStageState( 1, D3DTSS_BUMPENVMAT00, F2DW(1.0f) );
d3dDevice->SetTextureStageState( 1, D3DTSS_BUMPENVMAT01, F2DW(0.0f) );
d3dDevice->SetTextureStageState( 1, D3DTSS_BUMPENVMAT10, F2DW(0.0f) );
d3dDevice->SetTextureStageState( 1, D3DTSS_BUMPENVMAT11, F2DW(1.0f) );

Si vous définissez l’opération de mappage de bosses pour inclure la luminance (D3DTOP_BUMPENVMAPLUMINANCE), vous devez définir les contrôles de luminance. Les contrôles de luminance configurent la façon dont le système calcule la luminance avant de moduler la couleur à partir de la texture à l’étape suivante. Pour plus d’informations, consultez Formules de mappage de bosses (Direct3D 9).

// Set luminance controls. This is only needed when using
// a bump map that contains luminance, and when the 
// D3DTOP_BUMPENVMAPLUMINANCE texture blending operation is
// being used.
//
// Note  These calls rely on the following inline shortcut function:
//   inline DWORD F2DW( FLOAT f ) { return *((DWORD*)&f); }
d3dDevice->SetTextureStageState( 1, D3DTSS_BUMPENVLSCALE, F2DW(0.5f) );
d3dDevice->SetTextureStageState( 1, D3DTSS_BUMPENVLOFFSET, F2DW(0.0f) );

Une fois que votre application a configuré les paramètres de mappage de bosses, elle peut effectuer un rendu normal et les polygones rendus reçoivent des effets de mappage de bosses.

Notez que l’exemple précédent montre les paramètres définis pour le mappage de l’environnement spéculaire. Lors de l’exécution d’un mappage de lumière diffuse, les applications définissent l’opération de fusion de textures de la dernière étape sur D3DTOP_MODULATE. Pour plus d’informations, consultez Cartes de lumière diffuse (Direct3D 9).

Mappage de bosses