Verwenden komprimierter Texturen (Direct3D 9)
Ermitteln der Unterstützung für komprimierte Texturen
Um den Adapter zu testen, geben Sie ein beliebiges Pixelformat an, das DXT1, DXT2, DXT3, DXT4 oder DXT5 verwendet. Wenn IDirect3D9::CheckDeviceFormat D3D_OK zurückgibt, kann das Gerät eine 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 ermitteln, 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 Oberfläche im komprimierten Format 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 mithilfe von IDirect3DTexture9::GetSurfaceLevel abgerufen wurde. Diese Funktionen behandeln die Konvertierung in und aus komprimierten Texturformaten.
Sie können DDS-Dateien (Compressed Texture) erstellen und konvertieren, indem Sie den DirectX-Textur-Editor (Dxtex.exe) verwenden, der mit dem DirectX SDK bereitgestellt wird. Sie können Dxtex.exe abrufen und über das DirectX SDK erfahren. Informationen zum DirectX SDK finden Sie unter Wo ist 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 bestimmten Format erforderlich ist.
Die folgende Tabelle zeigt die fünf Typen komprimierter Texturen. Weitere Informationen zur Speicherung der Daten finden Sie unter Komprimierte Texturformate (Direct3D 9). Sie benötigen diese Informationen nur, wenn Sie Ihre eigenen Komprimierungsroutinen schreiben.
FOURCC | BESCHREIBUNG | Alpha vormultipliziert? |
---|---|---|
DXT1 | Undurchsichtige/1-Bit-Alpha | – |
DXT2 | Explizites Alpha | Ja |
DXT3 | Explizites Alpha | Nein |
DXT4 | Interpolierte Alpha | Ja |
DXT5 | Interpolierte Alpha | Nein |
Wenn Sie Daten aus einem nicht vormultiplizierten Format in ein vormultipliziertes Format übertragen, skaliert Direct3D die Farben basierend auf den Alphawerten. Das Übertragen von Daten aus einem vormultiplizierten Format in ein nicht vordefiniertes Format wird nicht unterstützt. Wenn Sie versuchen, Daten aus einer vormultiplizierten Alphaquelle an ein nicht vormultipliziertes Alphaziel zu übertragen, gibt die Methode D3DERR_INVALIDCALL zurück. Wenn Sie Daten von einer vormultiplizierten Alphaquelle an ein Ziel ohne Alpha übertragen, werden die Quellfarbkomponenten, die nach Alpha skaliert wurden, unverändert kopiert.
Dekomprimieren komprimierter Texturoberflächen
Wie beim Komprimieren einer Texturoberfläche erfolgt das Dekomprimieren einer komprimierten Textur über Direct3D-Kopierdienste.
Um eine komprimierte Texturoberfläche auf eine nicht komprimierte Texturoberfläche zu kopieren, verwenden Sie die Funktion D3DXLoadSurfaceFromSurface. Diese Funktion verarbeitet die Komprimierung auf und von komprimierten und unkomprimierten Oberflächen.
Zugehörige Themen