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-
- DDS Variants
- Verwenden von Texturarrays in Direct3D 10/11
- allgemeine DDS-Dateiressourcenformate und zugehörige Headerinhalte
- Verwandte Themen
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.