Guia de programação para DDS
O Direct3D implementa o formato de ficheiro DDS para armazenar texturas não comprimidas ou comprimidas (DXTn). O formato de arquivo implementa vários tipos ligeiramente diferentes projetados para armazenar diferentes tipos de dados e suporta texturas de camada única, texturas com mipmaps, mapas de cubo, mapas de volume e matrizes de textura (no Direct3D 10/11). Esta seção descreve o layout de um arquivo DDS.
Para obter ajuda na criação de uma textura no Direct3D 11, consulte Como criar uma textura. Para obter ajuda no Direct3D 9, consulte Suporte a textura no D3DX (Direct3D 9).
- de layout de arquivo DDS
- Variantes DDS
- Usando matrizes de textura no Direct3D 10/11
- Formatos comuns de recursos de arquivo DDS e conteúdo de cabeçalho associado
- Tópicos relacionados
Layout de arquivo DDS
Um arquivo DDS é um arquivo binário que contém as seguintes informações:
Um DWORD (número mágico) contendo o valor do código de quatro caracteres 'DDS' (0x20534444).
Uma descrição dos dados no ficheiro.
Os dados são descritos com uma descrição de cabeçalho usando DDS_HEADER; O formato de pixel é definido usando DDS_PIXELFORMAT. Observe que as estruturas DDS_HEADER e DDS_PIXELFORMAT substituem as estruturas DDSURFACEDESC2, DDSCAPS2 e DDPIXELFORMAT DirectDraw 7 obsoletas. DDS_HEADER é o equivalente binário de DDSURFACEDESC2 e DDSCAPS2. DDS_PIXELFORMAT é o equivalente binário de DDPIXELFORMAT.
DWORD dwMagic; DDS_HEADER header;
Se o DDS_PIXELFORMAT dwFlags estiver definido como DDPF_FOURCC e dwFourCC estiver definido como "DX10", uma estrutura de DDS_HEADER_DXT10 adicional estará presente para acomodar matrizes de textura ou formatos DXGI que não podem ser expressos como um formato de pixel RGB, como formatos de ponto flutuante, formatos sRGB, etc. Quando a estrutura DDS_HEADER_DXT10 estiver presente, toda a descrição dos dados terá esta aparência.
DWORD dwMagic; DDS_HEADER header; DDS_HEADER_DXT10 header10;
Um ponteiro para uma matriz de bytes que contém os dados da superfície principal.
BYTE bdata[]
Um ponteiro para uma matriz de bytes que contém as superfícies restantes, tais como; Níveis de MIPMAP, rostos em um mapa de cubo, profundidades em uma textura de volume. Siga estes links para obter mais informações sobre o layout do arquivo DDS para: textura, um mapa de cubo ou uma textura de volume .
BYTE bdata2[]
Para um amplo suporte de hardware, recomendamos que você use os 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_UNORMou DXGI_FORMAT_BC3_UNORM_SRGB formato.
Para obter mais informações sobre formatos de textura compactados, consulte Compactação de bloco de textura no Direct3D 11 e Compactação de bloco (Direct3D 10).
A biblioteca D3DX (por exemplo, D3DX11.lib) e outras bibliotecas semelhantes fornecem de forma não confiável ou inconsistente o valor de pitch no dwPitchOrLinearSize membro da estrutura DDS_HEADER. Portanto, quando você lê e grava em arquivos DDS, recomendamos que você calcule o pitch de uma das seguintes maneiras para os formatos indicados:
Para formatos compactados em bloco, calcule o pitch como:
max( 1, ((width+3)/4) * tamanho do bloco
O tamanho do bloco é de 8 bytes para os formatos DXT1, BC1 e BC4 e 16 bytes para outros formatos compactados em bloco.
Para formatos R8G8_B8G8, G8R8_G8B8, embalados com UYVY e YUY2 legados, calcule o pitch como:
((largura+1) >> 1) * 4
Para outros formatos, calcule o pitch como:
( largura * bits por pixel + 7 ) / 8
Você divide por 8 para alinhamento de bytes.
Observação
O valor de pitch que você calcula nem sempre é igual ao pitch que o tempo de execução fornece, que é alinhado com DWORD em algumas situações e alinhado com bytes em outras situações. Portanto, recomendamos que você copie uma linha de verificação de cada vez, em vez de tentar copiar a imagem inteira em uma cópia.
Variantes DDS
Existem muitas ferramentas que criam e consomem arquivos DDS, mas eles podem variar nos detalhes do que eles exigem no cabeçalho. Os gravadores devem preencher os cabeçalhos da forma mais completa possível, e os leitores devem verificar os valores mínimos para compatibilidade máxima. Para validar um arquivo DDS, um leitor deve garantir que o arquivo tenha pelo menos 128 bytes de comprimento para acomodar o valor mágico e o cabeçalho básico, o valor mágico é 0x20534444 ("DDS"), o tamanho DDS_HEADER é 124 e o DDS_PIXELFORMAT no tamanho do cabeçalho é 32. Se o DDS_PIXELFORMAT dwFlags estiver definido como DDPF_FOURCC e um dwFourCC estiver definido como "DX10", o tamanho total do arquivo precisará ser de pelo menos 148 bytes.
Existem algumas variantes comuns em uso onde o formato de pixel é definido como um código DDPF_FOURCC onde dwFourCC é definido como um D3DFORMAT ou DXGI_FORMAT valor de enumeração. Não há como saber se um valor de enumeração é um D3DFORMAT ou um DXGI_FORMAT, por isso é altamente recomendável que a extensão "DX10" e o cabeçalho DDS_HEADER_DXT10 sejam usados para armazenar o dxgiFormat quando o DDS_PIXELFORMAT básico não puder expressar o formato.
O DDS_PIXELFORMAT padrão deve ser preferido para máxima compatibilidade para armazenar dados RGB não compactados e dados DXT1-5, pois nem todas as ferramentas DDS suportam a extensão DX10.
Usando matrizes de textura no Direct3D 10/11
As novas estruturas DDS (DDS_HEADER e DDS_HEADER_DXT10) no Direct3D 10/11 estendem o formato de arquivo DDS para suportar uma matriz de texturas, que é um novo tipo de recurso no Direct3D 10/11. Aqui está um código de exemplo que mostra como acessar os diferentes níveis de mipmap em uma matriz de texturas, usando os novos cabeçalhos.
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++)
{
...
}
}
Formatos comuns de recursos de arquivo DDS e conteúdo de cabeçalho associado
Formato do recurso | dwBandeiras | 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 do recurso | dwBandeiras | 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 |
Qualquer formato DXGI | DDS_FOURCC | "DX10" |
* = Um leitor DDS robusto deve ser capaz de lidar com esses códigos de formato legado. No entanto, tal leitor DDS deve preferir usar a extensão de cabeçalho "DX10" quando escreve esses códigos de formato para evitar ambiguidade.
** = Devido a alguns problemas de longa data em implementações comuns de leitores e gravadores DDS, a maneira mais robusta de escrever dados do tipo 10:10:10:2 é usar a extensão de cabeçalho "DX10" com o código DXGI_FORMAT "24" (ou seja, o valor DXGI_FORMAT_R10G10B10A2_UNORM). D3DFMT_A2R10G10B10 dados devem ser convertidos em dados do tipo 10:10:10:2 antes de serem gravados como um arquivo DDS de formato DXGI_FORMAT_R10G10B10A2_UNORM.