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).
- layout di file DDS
- varianti DDS
- Uso di matrici di trame in Direct3D 10/11
- formati comuni di risorse di file DDS e contenuto dell'intestazione associato
- argomenti correlati
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.