Condividi tramite


Guida alla programmazione per DDS

Direct3D implementa il formato di file DDS per l'archiviazione di trame DXTn (uncompressed o compresso). 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 informazioni su Direct3D 9, vedere supporto delle trame in D3DX (Direct3D 9).

DDS File Layout

Un file DDS è un file binario che contiene le informazioni seguenti:

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

  • 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 deprecate 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 il DDS_PIXELFORMAT dwFlags è impostato su DDPF_FOURCC e dwFourCC è impostato su "DX10" una struttura aggiuntiva DDS_HEADER_DXT10 sarà presente per contenere 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;
    
  • Puntatore a una matrice di byte che contiene i dati della superficie principale.

    BYTE bdata[]
    
  • Puntatore a una matrice di byte che contiene le superfici rimanenti, ad esempio; livelli mipmap, visi in una mappa del cubo, profondità in una trama del volume. Per altre informazioni sul layout del file DDS per un oggetto: trama, una mappa del cubo o una trama del volume .

    BYTE bdata2[]
    

Per il supporto hardware generale, è consigliabile usare il 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_UNORMo DXGI_FORMAT_BC3_UNORM_SRGB format.

Per altre info sui formati di trama compressi, vedi compressione del blocco trama in Direct3D 11 e compressione a blocchi (Direct3D 10).

La libreria D3DX ,ad esempio D3DX11.lib, e altre librerie simili, forniscono in modo non coerente o incoerente il valore di passo nel dwPitchOrLinearSize membro 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 l'inclinazione come segue:

    max( 1, ((width+3)/4) ) * block-size

    Le dimensioni del blocco sono di 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 con pacchetto YUY2 legacy, calcolare il passo come segue:

    ((width+1) >> 1) * 4

  • Per altri formati, calcolare l'inclinazione come segue:

    ( larghezza * bit per pixel + 7 ) / 8

    Si divide per 8 per l'allineamento dei byte.

Nota

Il valore dell'inclinazione calcolato non è sempre uguale al passo fornito dal runtime, allineato AWORD in alcune situazioni e allineato ai 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 garantire la massima compatibilità. Per convalidare un file DDS, un lettore deve assicurarsi che il file sia lungo almeno 128 byte per contenere il valore magic e l'intestazione di base, il valore magic è 0x20534444 ("DDS"), la dimensione DDS_HEADER è 124 e il 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 del 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 è un D3DFORMAT o un DXGI_FORMAT, pertanto è consigliabile usare l'estensione "DX10" e DDS_HEADER_DXT10 intestazione per archiviare dxgiFormat quando il DDS_PIXELFORMAT di base non può esprimere il formato.

Il DDS_PIXELFORMAT standard deve essere preferito per garantire la massima compatibilità per archiviare i dati non compressi RGB e i dati DXT1-5, perché 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. Di seguito è riportato un codice di esempio che illustra come accedere ai diversi livelli 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 di file DDS e contenuto dell'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 data 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