Verwenden komprimierter Texturen (Direct3D 9)
Bestimmen der Unterstützung für komprimierte Texturen
Geben Sie zum Testen des Adapters ein beliebiges Pixelformat an, das DXT1, DXT2, DXT3, DXT4 oder DXT5 verwendet. Wenn IDirect3D9::CheckDeviceFormat D3D _ OK zurückgibt, kann das Gerät Textur direkt aus einer komprimierten Texturoberfläche erstellen, die dieses Format verwendet. Wenn ja, können Sie komprimierte Texturoberflächen direkt mit Direct3D verwenden, indem Sie die IDirect3DDevice9::SetTexture-Methode aufrufen. Im folgenden Codebeispiel wird gezeigt, wie Sie bestimmen, ob der Adapter ein komprimiertes Texturformat unterstützt.
BOOL IsCompressedTextureFormatOk( D3DFORMAT TextureFormat,
D3DFORMAT AdapterFormat )
{
HRESULT hr = pD3D->CheckDeviceFormat( D3DADAPTER_DEFAULT,
D3DDEVTYPE_HAL,
AdapterFormat,
0,
D3DRTYPE_TEXTURE,
TextureFormat);
return SUCCEEDED( hr );
}
Wenn das Gerät die Texturierung von komprimierten Texturoberflächen nicht unterstützt, können Sie Texturdaten weiterhin in einer komprimierten Formatoberfläche speichern. Sie müssen jedoch alle komprimierten Texturen in ein unterstütztes Format konvertieren, bevor sie für die Texturierung verwendet werden können.
Erstellen komprimierter Texturen
Nachdem Sie ein Gerät erstellt haben, das ein komprimiertes Texturformat auf dem Adapter unterstützt, können Sie eine komprimierte Texturressource erstellen. Rufen Sie IDirect3DDevice9::CreateTexture auf, und geben Sie ein komprimiertes Texturformat für den Format-Parameter an.
Rufen Sie vor dem Laden eines Bilds in ein Texturobjekt einen Zeiger auf die Texturoberfläche ab, indem Sie die IDirect3DTexture9::GetSurfaceLevel-Methode aufrufen.
Jetzt können Sie eine beliebige D3DXLoadSurfacexxx-Funktion verwenden, um ein Bild auf die Oberfläche zu laden, das mit IDirect3DTexture9::GetSurfaceLevelabgerufen wurde. Diese Funktionen verarbeiten die Konvertierung in und aus komprimierten Texturformaten.
Sie können DDS-Dateien (Compressed Texture) mithilfe des DirectX Texture Editor (Dxtex.exe) erstellen und konvertieren, der mit dem DirectX SDK bereitgestellt wird. Sie können Dxtex.exe abrufen und sich über das DirectX SDK darüber informieren. Informationen zum DirectX SDK finden Sie unter Wo befindet sich das DirectX SDK?.
Der Vorteil dieses Verhaltens besteht darin, dass eine Anwendung den Inhalt einer komprimierten Oberfläche in eine Datei kopieren kann, ohne zu berechnen, wie viel Speicher für eine Oberfläche mit einer bestimmten Breite und Höhe im spezifischen Format erforderlich ist.
Die folgende Tabelle zeigt die fünf Typen komprimierter Texturen. Weitere Informationen zur Speicherung der Daten finden Sie unter Compressed Texture Formats (Direct3D 9) (Komprimierte Texturformate (Direct3D 9)). Sie benötigen diese Informationen nur, wenn Sie Eigene Komprimierungsroutinen schreiben.
| FOURCC | BESCHREIBUNG | Alpha vormultiplizieren? |
|---|---|---|
| DXT1 | Opakes/1-Bit-Alpha | – |
| DXT2 | Explizites Alpha | Ja |
| DXT3 | Explizites Alpha | Nein |
| DXT4 | Interpoliertes Alpha | Ja |
| DXT5 | Interpoliertes Alpha | Nein |
Wenn Sie Daten aus einem nicht prämultipliierten Format in ein prämultipliiertes Format übertragen, skaliert Direct3D die Farben basierend auf den Alphawerten. Das Übertragen von Daten aus einem prämultiplizierten Format in ein nicht prämultipliiertes Format wird nicht unterstützt. Wenn Sie versuchen, Daten aus einer prämultiplizierten Alphaquelle an ein nicht prämultipliiertes Alphaziel zu übertragen, gibt die Methode D3DERR _ INVALIDCALL zurück. Wenn Sie Daten aus einer prämultiplizierten Alphaquelle an ein Ziel ohne Alpha übertragen, werden die Quellfarbkomponenten, die durch Alpha skaliert wurden, wie besehen kopiert.
Dekomprimieren komprimierter Texturoberflächen
Wie beim Komprimieren einer Texturoberfläche erfolgt die Dekomprimierung einer komprimierten Textur über Direct3D-Kopierdienste.
Verwenden Sie die Funktion D3DXLoadSurfaceFromSurface,um eine komprimierte Texturoberfläche auf eine nicht komprimierte Texturoberfläche zu kopieren. Diese Funktion verarbeitet die Komprimierung auf und von komprimierten und unkomprimierten Oberflächen.