Compartilhar via


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

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.

DDS