Partager via


Utilisation de textures compressées (Direct3D 9)

Détermination de la prise en charge des textures compressées

Pour tester l’adaptateur, spécifiez un format de pixel qui utilise DXT1, DXT2, DXT3, DXT4 ou DXT5. Si IDirect3D9::CheckDeviceFormat retourne D3D_OK, l’appareil peut créer une texture directement à partir d’une surface de texture compressée qui utilise ce format. Dans ce cas, vous pouvez utiliser des surfaces de texture compressées directement avec Direct3D en appelant la méthode IDirect3DDevice9::SetTexture . L’exemple de code suivant montre comment déterminer si l’adaptateur prend en charge un format de texture compressé.

BOOL IsCompressedTextureFormatOk( D3DFORMAT TextureFormat, 
                                  D3DFORMAT AdapterFormat ) 
{
    HRESULT hr = pD3D->CheckDeviceFormat( D3DADAPTER_DEFAULT,
                                          D3DDEVTYPE_HAL,
                                          AdapterFormat,
                                          0,
                                          D3DRTYPE_TEXTURE,
                                          TextureFormat);

    return SUCCEEDED( hr );
}

Si l’appareil ne prend pas en charge la texturation à partir de surfaces de texture compressées, vous pouvez toujours stocker les données de texture dans une surface de format compressée, mais vous devez convertir toutes les textures compressées dans un format pris en charge avant de pouvoir être utilisées pour la texturation.

Création de textures compressées

Après avoir créé un appareil qui prend en charge un format de texture compressé sur l’adaptateur, vous pouvez créer une ressource de texture compressée. Appelez IDirect3DDevice9::CreateTexture et spécifiez un format de texture compressé pour le paramètre Format.

Avant de charger une image dans un objet de texture, récupérez un pointeur vers la surface de texture en appelant la méthode IDirect3DTexture9::GetSurfaceLevel .

Vous pouvez maintenant utiliser n’importe quelle fonction D3DXLoadSurfacexxx pour charger une image sur la surface récupérée à l’aide de IDirect3DTexture9::GetSurfaceLevel. Ces fonctions gèrent la conversion vers et depuis les formats de texture compressés.

Vous pouvez créer et convertir des fichiers de texture compressé (DDS) à l’aide de l’éditeur de texture DirectX (Dxtex.exe) fourni avec le Kit de développement logiciel (SDK) DirectX. Vous pouvez obtenir des Dxtex.exe et en savoir plus à ce sujet à partir du Kit de développement logiciel (SDK) DirectX. Pour plus d’informations sur le Kit de développement logiciel (SDK) DirectX, consultez Où se trouve le Kit de développement logiciel (SDK) DirectX ?.

L’avantage de ce comportement est qu’une application peut copier le contenu d’une surface compressée dans un fichier sans calculer la quantité de stockage nécessaire pour une surface d’une largeur et d’une hauteur particulières dans le format spécifique.

Le tableau suivant présente les cinq types de textures compressées. Pour plus d’informations sur le stockage des données, consultez Formats de texture compressés (Direct3D 9). Vous n’avez besoin de ces informations que si vous écrivez vos propres routines de compression.

FOURCC Description Alpha prémultiplié ?
DXT1 Opaque/alpha 1 bits N/A
DXT2 Alpha explicite Oui
DXT3 Alpha explicite Non
DXT4 Alpha interpolée Oui
DXT5 Alpha interpolée Non

 

Lorsque vous transférez des données d’un format non prémultiplié vers un format prémultiplié, Direct3D met à l’échelle les couleurs en fonction des valeurs alpha. Le transfert de données d’un format prémultiplié vers un format non prémultiplié n’est pas pris en charge. Si vous essayez de transférer des données d’une source alpha prémultipliée vers une destination alpha non prémultipliée, la méthode retourne D3DERR_INVALIDCALL. Si vous transférez des données d’une source alpha prémultipliée vers une destination qui n’a pas d’alpha, les composants de couleur source, qui ont été mis à l’échelle par alpha, sont copiés tels quels.

Décompression des surfaces de texture compressée

Comme pour la compression d’une surface de texture, la décompression d’une texture compressée est effectuée via les services de copie Direct3D.

Pour copier une surface de texture compressée vers une surface de texture non compressée, utilisez la fonction D3DXLoadSurfaceFromSurface. Cette fonction gère la compression vers et depuis les surfaces compressées et non compressées.

Ressources de texture compressées