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 How to: Create a Texture. Para obter ajuda no Direct3D 9, consulte Suporte à textura noD3DX (Direct3D 9).
- de layout de arquivo DDS
- variantes DDS
- usando matrizes de textura no Direct3D 11/10
- 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) que contém o valor de código de 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 de DDS_HEADER_DXT10 estiver presente, toda a descrição de dados será semelhante a esta.
DWORD dwMagic; DDS_HEADER header; DDS_HEADER_DXT10 header10;
Um ponteiro para uma matriz de bytes que contém os dados principais da superfície.
BYTE bdata[]
Um ponteiro para uma matriz de bytes que contém as superfícies restantes, como; níveis de mipmap, faces 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: de textura, um mapa de cubo ou uma textura de volume .
BYTE bdata2[]
Para obter amplo suporte a hardware, recomendamos que você use o 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 formato DXGI_FORMAT_BC3_UNORM_SRGB.
Para obter mais informações sobre formatos de textura compactada, consulte Compactação de blocos 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 injustificada ou inconsistente o valor de pitch no dwPitchOrLinearSize membro da estrutura DDS_HEADER. Portanto, ao ler e gravar em arquivos DDS, recomendamos que você compute o pitch de uma das seguintes maneiras para os formatos indicados:
Para formatos compactados em bloco, compute o pitch 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 repletos de UYVY e herdados repletos de YUY2, compute o pitch como:
((width+1) >> 1) * 4
Para outros formatos, compute o pitch como:
( largura * bits por pixel + 7 ) / 8
Você divide por 8 para alinhamento de bytes.
Nota
O valor de pitch que você calcula nem sempre é igual ao tom fornecido pelo runtime, que é alinhado a DWORD em algumas situações e alinhado por 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 do 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 da maneira mais completa possível, e os leitores devem verificar os valores mínimos para obter a 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 valor de enumeração D3DFORMAT ou DXGI_FORMAT. 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.
O DDS_PIXELFORMAT padrão deve ser preferencial para a compatibilidade máxima para armazenar dados não compactados 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 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 de tipo 10:10:10:2 antes de serem gravados como um arquivo DDS de formato DXGI_FORMAT_R10G10B10A2_UNORM.