Teilen über


Programmierhandbuch für DDS

Direct3D implementiert das DDS-Dateiformat zum Speichern von unkomprimierten oder komprimierten Texturen (DXTn). Das Dateiformat implementiert mehrere leicht unterschiedliche Typen, die für das Speichern verschiedener Datentypen konzipiert sind, und unterstützt Einzelne Layer-Texturen, Texturen mit Mipmaps, Cubezuordnungen, Volumezuordnungen und Texturarrays (in Direct3D 10/11). In diesem Abschnitt wird das Layout einer DDS-Datei beschrieben.

Hilfe zum Erstellen einer Textur in Direct3D 11 finden Sie unter How to: Create a Texture. Hilfe zu Direct3D 9 finden Sie unter Texturunterstützung in D3DX (Direct3D 9).

DDS-Dateilayout

Eine DDS-Datei ist eine Binärdatei, die die folgenden Informationen enthält:

  • Ein DWORD (magische Zahl), der den vierstellige Codewert "DDS" (0x20534444) enthält.

  • Eine Beschreibung der Daten in der Datei.

    Die Daten werden mit einer Kopfzeilenbeschreibung mithilfe von DDS_HEADERbeschrieben; Das Pixelformat wird mithilfe von DDS_PIXELFORMATdefiniert. Beachten Sie, dass die strukturen DDS_HEADER und DDS_PIXELFORMAT die veralteten DDSURFACEDESC2, DDSCAPS2 und DDPIXELFORMAT DirectDraw 7 ersetzen. DDS_HEADER ist die binäre Entsprechung von DDSURFACEDESC2 und DDSCAPS2. DDS_PIXELFORMAT ist das binäre Äquivalent von DDPIXELFORMAT.

    DWORD               dwMagic;
    DDS_HEADER          header;
    
    

    Wenn die DDS_PIXELFORMAT dwFlags auf DDPF_FOURCC und dwFourCC auf "DX10" festgelegt ist, wird eine zusätzliche DDS_HEADER_DXT10 Struktur vorhanden sein, um Texturarrays oder DXGI-Formate aufzunehmen, die nicht als RGB-Pixelformat wie Gleitkommaformate, sRGB-Formate usw. ausgedrückt werden können. Wenn die DDS_HEADER_DXT10 Struktur vorhanden ist, sieht die gesamte Datenbeschreibung wie folgt aus.

    DWORD               dwMagic;
    DDS_HEADER          header;
    DDS_HEADER_DXT10    header10;
    
  • Ein Zeiger auf ein Bytearray, das die Hauptoberflächendaten enthält.

    BYTE bdata[]
    
  • Ein Zeiger auf ein Bytearray, das die verbleibenden Oberflächen enthält, z. B. Mipmap-Ebenen, Gesichter in einer Cubezuordnung, Tiefen in einer Volumetextur. Folgen Sie diesen Links, um weitere Informationen zum DDS-Dateilayout für eine: Textur, eine Cubezuordnungoder eine Volumentextur.

    BYTE bdata2[]
    

Für eine umfassende Hardwareunterstützung empfehlen wir, die DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_FORMAT_R8G8B8A8_UNORM_SRGB, DXGI_FORMAT_R8G8B8A8_SNORM, DXGI_FORMAT_B8G8R8A8_UNORM, DXGI_FORMAT_R16G16_SNORM, DXGI_FORMAT_R8G8_SNORM, DXGI_FORMAT_R8_UNORM, DXGI_FORMAT_BC1_UNORM, DXGI_FORMAT_BC1_UNORM_SRGB, DXGI_FORMAT_BC2_UNORM, DXGI_FORMAT_BC2_UNORM_SRGB, DXGI_FORMAT_BC3_UNORModer DXGI_FORMAT_BC3_UNORM_SRGB Format.

Weitere Informationen zu komprimierten Texturformaten finden Sie unter Texturblockkomprimierung in Direct3D 11 und Blockkomprimierung (Direct3D 10).

Die D3DX-Bibliothek (z. B. D3DX11.lib) und andere ähnliche Bibliotheken liefern unzustellbar oder inkonsistent den Pitchwert im dwPitchOrLinearSize Member der DDS_HEADER Struktur. Daher wird empfohlen, beim Lesen und Schreiben in DDS-Dateien die Neigung auf eine der folgenden Arten für die angegebenen Formate zu berechnen:

  • Berechnen Sie bei blockkomprimierten Formaten die Neigung wie:

    max( 1, ((breite+3)/4) ) * Blockgröße

    Die Blockgröße beträgt 8 Bytes für DXT1-, BC1- und BC4-Formate und 16 Bytes für andere blockkomprimierte Formate.

  • Für R8G8_B8G8, G8R8_G8B8, älteren UYVY-verpackten und älteren YUY2-gepackten Formaten berechnen Sie den Pitch wie:

    ((Breite+1) >> 1) * 4

  • Berechnen Sie bei anderen Formaten die Neigung wie:

    ( Breite * Bits pro Pixel + 7 ) / 8

    Sie dividieren durch 8 für die Byteausrichtung.

Anmerkung

Der von Ihnen berechnete Neigungswert entspricht nicht immer der Neigung, die von der Laufzeit bereitgestellt wird, dWORD-ausgerichtet in einigen Situationen und byteausrichtung in anderen Situationen. Daher wird empfohlen, eine Scanzeile gleichzeitig zu kopieren, anstatt zu versuchen, das gesamte Bild in einer Kopie zu kopieren.

DDS-Varianten

Es gibt viele Tools, die DDS-Dateien erstellen und nutzen, aber sie können in den Details der Anforderungen im Header variieren. Autoren sollten die Kopfzeilen so vollständig wie möglich auffüllen, und Leser sollten die Minimalwerte auf maximale Kompatibilität überprüfen. Um eine DDS-Datei zu überprüfen, sollte ein Leser sicherstellen, dass die Datei mindestens 128 Byte lang ist, um den magischen Wert und den grundlegenden Header aufzunehmen, der magische Wert 0x20534444 ("DDS"), die DDS_HEADER Größe ist 124, und die DDS_PIXELFORMAT in der Kopfzeilengröße beträgt 32. Wenn die DDS_PIXELFORMAT dwFlags auf DDPF_FOURCC festgelegt ist und ein dwFourCC auf "DX10" festgelegt ist, muss die Gesamtdateigröße mindestens 148 Byte betragen.

Es gibt einige gängige Varianten, bei denen das Pixelformat auf einen DDPF_FOURCC Code festgelegt ist, in dem dwFourCC auf einen D3DFORMAT- oder DXGI_FORMAT Enumerationswert festgelegt ist. Es gibt keine Möglichkeit zu erkennen, ob ein Enumerationswert ein D3DFORMAT oder ein DXGI_FORMAT ist. Daher wird dringend empfohlen, dass die Erweiterung "DX10" und DDS_HEADER_DXT10 Header stattdessen verwendet wird, um das dxgiFormat zu speichern, wenn das grundlegende DDS_PIXELFORMAT das Format nicht ausdrücken kann.

Der Standard-DDS_PIXELFORMAT sollte für maximale Kompatibilität zum Speichern von UNkomprimierten RGB-Daten und DXT1-5-Daten bevorzugt werden, da nicht alle DDS-Tools die DX10-Erweiterung unterstützen.

Verwenden von Texturarrays in Direct3D 10/11

Die neuen DDS-Strukturen (DDS_HEADER und DDS_HEADER_DXT10) in Direct3D 10/11 erweitern das DDS-Dateiformat, um ein Array von Texturen zu unterstützen, bei dem es sich um einen neuen Ressourcentyp in Direct3D 10/11 handelt. Hier ist ein Beispielcode, der zeigt, wie Sie mithilfe der neuen Kopfzeilen auf die verschiedenen Mipmap-Ebenen in einem Array von Texturen zugreifen.

DWORD               dwMagic;
DDS_HEADER          header;
DDS_HEADER_DXT10    header10;
   
for (int iArrayElement = 0; iArrayElement < header10.arraySize; iArrayElement++)
{
   for (int iMipLevel = 0; iMipLevel < header.dwMipMapCount; iMipLevel++)
   {
     ...
   }
}       

Allgemeine DDS-Dateiformate und zugehörige Headerinhalte

Ressourcenformat dwFlags dwRGBBitCount dwRBitMask dwGBitMask dwBBitMask dwABitMask
DXGI_FORMAT_R8G8B8A8_UNORM
D3DFMT_A8B8G8R8
DDS_RGBA 32 0xff 0xff00 0xff0000 0xff000000
DXGI_FORMAT_R16G16_UNORM
D3DFMT_G16R16
DDS_RGBA 32 0xffff 0xffff0000
**
DXGI_FORMAT_R10G10B10A2_UNORM
D3DFMT_A2B10G10R10
DDS_RGBA 32 0x3ff 0xffc00 0x3ff00000
DXGI_FORMAT_R16G16_UNORM
D3DFMT_G16R16
DDS_RGB 32 0xffff 0xffff0000
DXGI_FORMAT_B5G5R5A1_UNORM
D3DFMT_A1R5G5B5
DDS_RGBA 16 0x7c00 0x3e0 0x1f 0x8000
DXGI_FORMAT_B5G6R5_UNORM
D3FMT_R5G6B5
DDS_RGB 16 0xf800 0x7e0 0x1f
DXGI_A8_UNORM
D3DFMT_A8
DDS_ALPHA 8 0xff
D3DFMT_A8R8G8B8
DDS_RGBA 32 0xff0000 0xff00 0xff 0xff000000
D3DFMT_X8R8G8B8
DDS_RGB 32 0xff0000 0xff00 0xff
D3DFMT_X8B8G8R8
DDS_RGB 32 0xff 0xff00 0xff0000
**
D3DFMT_A2R10G10B10
DDS_RGBA 32 0x3ff00000 0xffc00 0x3ff 0xc0000000
D3DFMT_R8G8B8
DDS_RGB 24 0xff0000 0xff00 0xff
D3DFMT_X1R5G5B5
DDS_RGB 16 0x7c00 0x3e0 0x1f
D3DFMT_A4R4G4B4
DDS_RGBA 16 0xf00 0xf0 0xf 0xf000
D3DFMT_X4R4G4B4
DDS_RGB 16 0xf00 0xf0 0xf
D3DFMT_A8R3G3B2
DDS_RGBA 16 0xe0 0x1c 0x3 0xff00
D3DFMT_A8L8
DDS_LUMINANCE 16 0xff 0xff00
D3DFMT_L16
DDS_LUMINANCE 16 0xffff
D3DFMT_L8
DDS_LUMINANCE 8 0xff
D3DFMT_A4L4
DDS_LUMINANCE 8 0xf 0xf0
Ressourcenformat dwFlags dwFourCC
DXGI_FORMAT_BC1_UNORM
D3DFMT_DXT1
DDS_FOURCC "DXT1"
DXGI_FORMAT_BC2_UNORM
D3DFMT_DXT3
DDS_FOURCC "DXT3"
DXGI_FORMAT_BC3_UNORM
D3DFMT_DXT5
DDS_FOURCC "DXT5"
*
DXGI_FORMAT_BC4_UNORM
DDS_FOURCC "BC4U"
*
DXGI_FORMAT_BC4_SNORM
DDS_FOURCC "BC4S"
*
DXGI_FORMAT_BC5_UNORM
DDS_FOURCC "ATI2"
*
DXGI_FORMAT_BC5_SNORM
DDS_FOURCC "BC5S"
DXGI_FORMAT_R8G8_B8G8_UNORM
D3DFMT_R8G8_B8G8
DDS_FOURCC "RGBG"
DXGI_FORMAT_G8R8_G8B8_UNORM
D3DFMT_G8R8_G8B8
DDS_FOURCC "GRGB"
*
DXGI_FORMAT_R16G16B16A16_UNORM
D3DFMT_A16B16G16R16
DDS_FOURCC 36
*
DXGI_FORMAT_R16G16B16A16_SNORM
D3DFMT_Q16W16V16U16
DDS_FOURCC 110
*
DXGI_FORMAT_R16_FLOAT
D3DFMT_R16F
DDS_FOURCC 111
*
DXGI_FORMAT_R16G16_FLOAT
D3DFMT_G16R16F
DDS_FOURCC 112
*
DXGI_FORMAT_R16G16B16A16_FLOAT
D3DFMT_A16B16G16R16F
DDS_FOURCC 113
*
DXGI_FORMAT_R32_FLOAT
D3DFMT_R32F
DDS_FOURCC 114
*
DXGI_FORMAT_R32G32_FLOAT
D3DFMT_G32R32F
DDS_FOURCC 115
*
DXGI_FORMAT_R32G32B32A32_FLOAT
D3DFMT_A32B32G32R32F
DDS_FOURCC 116
D3DFMT_DXT2
DDS_FOURCC "DXT2"
D3DFMT_DXT4
DDS_FOURCC "DXT4"
D3DFMT_UYVY
DDS_FOURCC "UYVY"
D3DFMT_YUY2
DDS_FOURCC "YUY2"
D3DFMT_CxV8U8
DDS_FOURCC 117
Beliebiges DXGI-Format DDS_FOURCC "DX10"

* = Ein robuster DDS-Reader muss in der Lage sein, diese älteren Formatcodes zu verarbeiten. Ein solcher DDS-Reader sollte jedoch lieber die Headererweiterung "DX10" verwenden, wenn er diese Formatcodes schreibt, um Mehrdeutigkeit zu vermeiden.

** = Aufgrund einiger langjähriger Probleme bei häufigen Implementierungen von DDS-Lesern und Autoren besteht die robusteste Methode zum Schreiben von Daten vom Typ 10:10:10:2 darin, die Headererweiterung "DX10" mit dem DXGI_FORMAT Code "24" (d. a. dem DXGI_FORMAT_R10G10B10A2_UNORM Wert) zu verwenden. D3DFMT_A2R10G10B10 Daten sollten in 10:10:10:2-Typdaten konvertiert werden, bevor sie als DXGI_FORMAT_R10G10B10A2_UNORM Format-DDS-Datei geschrieben werden.

DDS-