Guida alla programmazione per DDS

Direct3D implementa il formato di file DDS per l'archiviazione di trame non compresse o compresse (DXTn). Il formato di file implementa diversi tipi leggermente diversi progettati per l'archiviazione di diversi tipi di dati e supporta trame a livello singolo, trame con mipmap, mappe cubi, mappe del volume e matrici di trame (in Direct3D 10/11). In questa sezione viene descritto il layout di un file DDS.

Per informazioni sulla creazione di una trama in Direct3D 11, vedere Procedura: Creare una trama. Per assistenza in Direct3D 9, vedere Supporto trama in D3DX (Direct3D 9).

DDS File Layout

Un file DDS è un file binario contenente le informazioni seguenti:

  • Un valore DWORD (numero chiave) contenente il valore del codice di quattro caratteri 'DDS ' (0x20534444).

  • Una descrizione dei dati nel file.

    I dati vengono descritti con una descrizione dell'intestazione usando DDS_HEADER; il formato pixel viene definito usando DDS_PIXELFORMAT. Si noti che le strutture DDS_HEADER e DDS_PIXELFORMAT sostituiscono le strutture DDSURFACEDESC2, DDSCAPS2 e DDPIXELFORMAT DirectDraw 7. DDS_HEADER è l'equivalente binario di DDSURFACEDESC2 e DDSCAPS2. DDS_PIXELFORMAT è l'equivalente binario di DDPIXELFORMAT.

    DWORD               dwMagic;
    DDS_HEADER          header;
    
    

    Se la DDS_PIXELFORMAT dwFlags è impostata su DDPF_FOURCC e dwFourCC è impostata su "DX10" una struttura DDS_HEADER_DXT10 aggiuntiva sarà presente per ospitare matrici di trame o formati DXGI che non possono essere espressi come formato pixel RGB, ad esempio formati a virgola mobile, formati sRGB e così via. Quando la struttura DDS_HEADER_DXT10 è presente, l'intera descrizione dei dati avrà un aspetto simile al seguente.

    DWORD               dwMagic;
    DDS_HEADER          header;
    DDS_HEADER_DXT10    header10;
    
  • Un puntatore a una matrice di byte contenente i dati della superficie principale.

    BYTE bdata[]
    
  • Un puntatore a una matrice di byte contenente le superfici rimanenti, ad esempio i livelli mipmap, le facce in una mappa di cubo, le profondità in una trama di volume. Visita questi collegamenti per altre informazioni sul layout dei file DDS per una texture, una mappa di cubo o una trama di volume.

    BYTE bdata2[]
    

Per il supporto hardware generale, è consigliabile usare 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_UNORM o DXGI_FORMAT_BC3_UNORM_SRGB formato.

Per altre informazioni sui formati di trama compressi, vedere Compressione del blocco trama in Direct3D 11 e Compressione blocchi (Direct3D 10).

La libreria D3DX ,ad esempio D3DX11.lib, e altre librerie simili non in modo incoerente o incoerente forniscono il valore di passo nel membro dwPitchOrLinearSize della struttura DDS_HEADER . Pertanto, quando si legge e si scrive nei file DDS, è consigliabile calcolare il passo in uno dei modi seguenti per i formati indicati:

  • Per i formati compressi a blocchi, calcolare il passo come segue:

    max( 1, ((width+3)/4) ) * dimensioni blocchi

    Le dimensioni del blocco sono 8 byte per i formati DXT1, BC1 e BC4 e 16 byte per altri formati compressi a blocchi.

  • Per R8G8_B8G8, G8R8_G8B8, formati con pacchetto UYVY legacy e formati con pacchetto YUY2 legacy, calcolare il passo come:

    ((larghezza+1) 1) >> * 4

  • Per altri formati, calcolare il passo come:

    ( larghezza * bit per pixel + 7 ) / 8

    Si divide per 8 per l'allineamento dei byte.

Nota

Il valore di passo calcolato non è sempre uguale al passo fornito dal runtime, allineato in alcune situazioni e allineato a byte in altre situazioni. È pertanto consigliabile copiare una riga di analisi alla volta anziché provare a copiare l'intera immagine in una copia.

Varianti DDS

Esistono molti strumenti che creano e usano file DDS, ma possono variare nei dettagli di ciò che richiedono nell'intestazione. I writer devono popolare le intestazioni il più possibile e i lettori devono controllare i valori minimi per la massima compatibilità. Per convalidare un file DDS, un lettore deve assicurarsi che il file sia almeno 128 byte per contenere il valore magico e l'intestazione di base, il valore magic è 0x20534444 ("DDS"), la dimensione DDS_HEADER è 124 e la DDS_PIXELFORMAT nella dimensione dell'intestazione è 32. Se la DDS_PIXELFORMAT dwFlags è impostata su DDPF_FOURCC e un dwFourCC è impostato su "DX10", le dimensioni totali dei file devono essere almeno 148 byte.

Esistono alcune varianti comuni in uso in cui il formato pixel è impostato su un codice DDPF_FOURCC in cui dwFourCC è impostato su un valore di enumerazione D3DFORMAT o DXGI_FORMAT. Non è possibile stabilire se un valore di enumerazione è D3DFORMAT o un DXGI_FORMAT, pertanto è consigliabile che l'estensione "DX10" e DDS_HEADER_DXT10 intestazione venga usata invece per archiviare dxgiFormat quando la DDS_PIXELFORMAT di base non può esprimere il formato.

La DDS_PIXELFORMAT standard deve essere preferita per garantire la massima compatibilità per archiviare dati non compressi RGB e dati DXT1-5 come non tutti gli strumenti DDS supportano l'estensione DX10.

Uso di matrici di trame in Direct3D 10/11

Le nuove strutture DDS (DDS_HEADER e DDS_HEADER_DXT10) in Direct3D 10/11 estendono il formato di file DDS per supportare una matrice di trame, ovvero un nuovo tipo di risorsa in Direct3D 10/11. Ecco un codice di esempio che illustra come accedere ai diversi livelli di mipmap in una matrice di trame, usando le nuove intestazioni.

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++)
   {
     ...
   }
}       

Formati comuni di risorse file DDS e contenuto intestazione associato

Formato risorsa 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
Formato risorsa 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
Qualsiasi formato DXGI DDS_FOURCC "DX10"

* = Un lettore DDS affidabile deve essere in grado di gestire questi codici di formato legacy. Tuttavia, un lettore DDS di questo tipo deve preferire l'estensione di intestazione "DX10" quando scrive questi codici di formato per evitare ambiguità.

** = A causa di alcuni problemi di lunga durata nelle implementazioni comuni di lettori e writer DDS, il modo più affidabile per scrivere i dati di tipo 10:10:10:2 consiste nell'usare l'estensione dell'intestazione "DX10" con il codice DXGI_FORMAT "24", ovvero il valore DXGI_FORMAT_R10G10B10A2_UNORM. D3DFMT_A2R10G10B10 i dati devono essere convertiti in dati di tipo 10:10:10:2 prima di essere scritti come file DDS in formato DXGI_FORMAT_R10G10B10A2_UNORM.

DDS