Guia de programação para DDS
O Direct3D implementa o formato de arquivo DDS para armazenar texturas DXTn (descompactadas ou compactadas). O formato de arquivo implementa vários tipos ligeiramente diferentes projetados para armazenar diferentes tipos de dados e dá suporte a 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 para criar uma textura no Direct3D 11, consulte Como criar uma textura. Para obter ajuda no Direct3D 9, consulte Suporte à textura em D3DX (Direct3D 9).
- Layout do arquivo DDS
- Variantes de DDS
- Usando matrizes de textura no Direct3D 10/11
- Formatos comuns de recurso de arquivo DDS e conteúdo de cabeçalho associado
- Tópicos relacionados
Layout do 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 de código com quatro caracteres 'DDS' (0x20534444).
Uma descrição dos dados no arquivo.
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 preteridas. 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 demais superfícies; por exemplo, níveis de minimapa, faces de um mapa de cubos, profundidades em uma textura de volume. Siga estes links para saber mais sobre o layout de arquivo DDS para: uma textura, um mapa de cubos ou uma textura de volume.
BYTE bdata2[]
Para obter amplo suporte a 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_SRGBDXGI_FORMAT_BC3_UNORM ou formato DXGI_FORMAT_BC3_UNORM_SRGB .
Para obter mais informações sobre formatos de textura compactadas, 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 confiável ou inconsistente o valor de pitch no membro dwPitchOrLinearSize da estrutura DDS_HEADER . Portanto, ao ler e gravar em arquivos DDS, recomendamos que você calcule a apresentação de uma das seguintes maneiras para os formatos indicados:
Para formatos compactados por bloco, compute a apresentação como:
max( 1, ((width+3)/4) ) * block-size
O tamanho do bloco é de 8 bytes para formatos DXT1, BC1 e BC4 e 16 bytes para outros formatos compactados em bloco.
Para R8G8_B8G8, G8R8_G8B8, formatos herdados empacotados em UYVY e herdados empacotados com YUY2, compute a apresentação como:
((width+1) >> 1) * 4
Para outros formatos, compute a apresentação 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 tom fornecido pelo runtime, que é alinhado ao DWORD em algumas situações e alinhado a 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 de DDS
Há muitas ferramentas que criam e consomem arquivos DDS, mas podem variar nos detalhes do que precisam no cabeçalho. Os gravadores devem preencher os cabeçalhos o mais completo possível, e os leitores devem marcar 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 do 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.
Há algumas variantes comuns em uso em que o formato de pixel é definido como um código DDPF_FOURCC em que 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, portanto, é 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.
A DDS_PIXELFORMAT padrão deve ser preferencial para a compatibilidade máxima para armazenar dados descompactados RGB e dados DXT1-5, pois nem todas as ferramentas DDS dão suporte à 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 dar suporte a 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 recurso de arquivo DDS e conteúdo de cabeçalho associado
Formato de recurso | 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 de recurso | 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 |
Qualquer formato DXGI | DDS_FOURCC | "DX10" |
* = Um leitor de DDS robusto deve ser capaz de lidar com esses códigos de formato herdados. No entanto, esse leitor de DDS deve preferir usar a extensão de cabeçalho "DX10" ao gravar esses códigos de formato para evitar ambiguidade.
** = Devido a alguns problemas de longa data em implementações comuns de leitores e gravadores de DDS, a maneira mais robusta de escrever dados de 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.