Programmeringsguide för DDS
Direct3D implementerar DDS-filformatet för lagring av okomprimerade eller komprimerade texturer (DXTn). Filformatet implementerar flera lite olika typer som utformats för att lagra olika typer av data och stöder texturer, texturer med mipmaps, kubkartor, volymkartor och strukturmatriser (i Direct3D 10/11). I det här avsnittet beskrivs layouten för en DDS-fil.
Mer information om hur du skapar en struktur i Direct3D 11 finns i How to: Create a Texture. Hjälp med Direct3D 9 finns i Stöd för struktur i D3DX (Direct3D 9).
- DDS-fillayout
- DDS-varianter
- Använda strukturmatriser i Direct3D 10/11
- vanliga DDS-filresursformat och tillhörande rubrikinnehåll
- Relaterade ämnen
DDS-fillayout
En DDS-fil är en binär fil som innehåller följande information:
Ett DWORD (magiskt nummer) som innehåller kodvärdet "DDS" (0x20534444).
En beskrivning av data i filen.
Data beskrivs med en rubrikbeskrivning med hjälp av DDS_HEADER; pixelformatet definieras med hjälp av DDS_PIXELFORMAT. Observera att strukturerna DDS_HEADER och DDS_PIXELFORMAT ersätter de inaktuella strukturerna DDSURFACEDESC2, DDSCAPS2 och DDPIXELFORMAT DirectDraw 7. DDS_HEADER är den binära motsvarigheten till DDSURFACEDESC2 och DDSCAPS2. DDS_PIXELFORMAT är den binära motsvarigheten till DDPIXELFORMAT.
DWORD dwMagic; DDS_HEADER header;
Om DDS_PIXELFORMAT dwFlags är inställt på DDPF_FOURCC och dwFourCC är inställt på "DX10" kommer ytterligare en DDS_HEADER_DXT10 struktur att finnas för texturmatriser eller DXGI-format som inte kan uttryckas som ett RGB-pixelformat, till exempel flyttalsformat, sRGB-format osv. När DDS_HEADER_DXT10 struktur finns ser hela databeskrivningen ut så här.
DWORD dwMagic; DDS_HEADER header; DDS_HEADER_DXT10 header10;
En pekare till en matris med byte som innehåller huvudytans data.
BYTE bdata[]
En pekare till en matris med byte som innehåller de återstående ytorna, till exempel; mipmap-nivåer, ansikten i en kubkarta, djup i en volymstruktur. Följ dessa länkar för mer information om DDS-fillayouten för en: struktur, en kubkartaeller en volymstruktur.
BYTE bdata2[]
För bred maskinvarusupport rekommenderar vi att du använder 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_UNORMeller DXGI_FORMAT_BC3_UNORM_SRGB format.
Mer information om komprimerade texturformat finns i Texturblockkomprimering i Direct3D 11 och BlockKomprimering (Direct3D 10).
D3DX-biblioteket (till exempel D3DX11.lib) och andra liknande bibliotek ger otillförlitligt eller inkonsekvent tonhöjdsvärdet i dwPitchOrLinearSize medlem i DDS_HEADER struktur. När du läser och skriver till DDS-filer rekommenderar vi därför att du beräknar pitchen på något av följande sätt för de angivna formaten:
För blockkomprimerade format beräknar du tonhöjden som:
max( 1, ((width+3)/4) ) * blockstorlek
Blockstorleken är 8 byte för DXT1-, BC1- och BC4-format och 16 byte för andra blockkomprimerade format.
För R8G8_B8G8, G8R8_G8B8, äldre UYVY-packade och äldre YUY2-packade format beräknar du tonhöjden som:
((bredd+1) >> 1) * 4
För andra format beräknar du tonhöjden som:
( bredd * bitar per bildpunkt + 7 ) / 8
Du delar med 8 för bytejustering.
Not
Det tonhöjdsvärde som du beräknar är inte alltid lika med den tonhöjd som körningsmiljön tillhandahåller, vilket är DWORD-justerat i vissa situationer och bytejusterat i andra situationer. Därför rekommenderar vi att du kopierar en genomsökningsrad i taget i stället för att försöka kopiera hela bilden i en kopia.
DDS-varianter
Det finns många verktyg som skapar och använder DDS-filer, men de kan variera i informationen om vad de behöver i rubriken. Författare bör fylla i rubrikerna så fullständigt som möjligt, och läsarna bör kontrollera de minimala värdena för maximal kompatibilitet. För att verifiera en DDS-fil bör en läsare se till att filen är minst 128 byte lång för att rymma det magiska värdet och den grundläggande rubriken, det magiska värdet är 0x20534444 ("DDS "), DDS_HEADER storlek är 124 och DDS_PIXELFORMAT i rubrikstorleken är 32. Om DDS_PIXELFORMAT dwFlags är inställt på DDPF_FOURCC och en dwFourCC är inställd på "DX10" måste den totala filstorleken vara minst 148 byte.
Det finns några vanliga varianter som används där pixelformatet är inställt på en DDPF_FOURCC kod där dwFourCC är inställt på ett D3DFORMAT- eller DXGI_FORMAT uppräkningsvärde. Det finns inget sätt att se om ett uppräkningsvärde är en D3DFORMAT eller en DXGI_FORMAT, så det rekommenderas starkt att tillägget "DX10" och DDS_HEADER_DXT10-huvudet används i stället för att lagra dxgiFormat när den grundläggande DDS_PIXELFORMAT inte kan uttrycka formatet.
Standard DDS_PIXELFORMAT bör föredras för maximal kompatibilitet för att lagra Okomprimerade RGB-data och DXT1-5-data eftersom inte alla DDS-verktyg stöder DX10-tillägget.
Använda strukturmatriser i Direct3D 10/11
De nya DDS-strukturerna (DDS_HEADER och DDS_HEADER_DXT10) i Direct3D 10/11 utökar DDS-filformatet för att stödja en matris med texturer, som är en ny resurstyp i Direct3D 10/11. Här är en exempelkod som visar hur du kommer åt de olika mipmap-nivåerna i en matris med texturer med hjälp av de nya rubrikerna.
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++)
{
...
}
}
Vanliga DDS-filresursformat och associerat rubrikinnehåll
Resursformat | 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 |
Resursformat | 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 |
Valfritt DXGI-format | DDS_FOURCC | "DX10" |
* = En robust DDS-läsare måste kunna hantera dessa äldre formatkoder. En sådan DDS-läsare bör dock föredra att använda rubriktillägget "DX10" när den skriver dessa formatkoder för att undvika tvetydighet.
** = På grund av några långvariga problem med vanliga implementeringar av DDS-läsare och författare är det mest robusta sättet att skriva ut 10:10:10:2-typdata att använda "DX10"-huvudtillägget med DXGI_FORMAT-koden "24" (det vill säga DXGI_FORMAT_R10G10B10A2_UNORM-värdet). D3DFMT_A2R10G10B10 data ska konverteras till 10:10:10:2-typdata innan de skrivs ut som en DDS-fil i DXGI_FORMAT_R10G10B10A2_UNORM format.