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
- Varianti DDS
- Uso di matrici di trame in Direct3D 10/11
- Formati comuni di risorse file DDS e contenuto intestazione associato
- Argomenti correlati
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.