Dela via


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

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.

DDS-