Compartir a través de


Guía de programación para DDS

Direct3D implementa el formato de archivo DDS para almacenar texturas sin comprimir o comprimidas (DXTn). El formato de archivo implementa varios tipos ligeramente diferentes diseñados para almacenar diferentes tipos de datos y admite texturas de capa única, texturas con mapas mip, mapas de cubo, mapas de volumen y matrices de texturas (en Direct3D 10/11). En esta sección se describe el diseño de un archivo DDS.

Para obtener ayuda para crear una textura en Direct3D 11, consulte Cómo: Crear una textura. Para obtener ayuda en Direct3D 9, consulte Compatibilidad con texturas en D3DX (Direct3D 9).

Diseño de archivo DDS

Un archivo DDS es un archivo binario que contiene la siguiente información:

  • Un DWORD (número mágico) con el valor de código de cuatro caracteres 'DDS ' (0x20534444).

  • Una descripción de los datos del archivo.

    Los datos se describen con una descripción de encabezado mediante DDS_HEADER; el formato de píxel se define mediante DDS_PIXELFORMAT. Tenga en cuenta que las estructuras DDS_HEADER y DDS_PIXELFORMAT reemplazan las estructuras DDSURFACEDESC2, DDSCAPS2 y DDPIXELFORMAT DirectDraw 7 en desuso. DDS_HEADER es el equivalente binario de DDSURFACEDESC2 y DDSCAPS2. DDS_PIXELFORMAT es el equivalente binario de DDPIXELFORMAT.

    DWORD               dwMagic;
    DDS_HEADER          header;
    
    

    Si el DDS_PIXELFORMAT dwFlags se establece en DDPF_FOURCC y dwFourCC se establece en "DX10" una estructura DDS_HEADER_DXT10 adicional estará presente para dar cabida a matrices de texturas o formatos DXGI que no se pueden expresar como un formato de píxel RGB, como formatos de punto flotante, formatos sRGB, etc. Cuando la estructura de DDS_HEADER_DXT10 esté presente, toda la descripción de los datos tendrá este aspecto.

    DWORD               dwMagic;
    DDS_HEADER          header;
    DDS_HEADER_DXT10    header10;
    
  • Puntero a una matriz de bytes que contiene los datos de la superficie principal.

    BYTE bdata[]
    
  • Puntero a una matriz de bytes que contiene las superficies restantes, como los niveles de mapas MIP, caras de un mapa de cubos, profundidades de una textura de volumen. Sigue estos vínculos para obtener más información sobre el diseño de un archivo DDS para: una textura, un mapa de cubos o una textura de volumen.

    BYTE bdata2[]
    

Para una amplia compatibilidad con hardware, se recomienda usar el 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_UNORMo DXGI_FORMAT_BC3_UNORM_SRGB formato.

Para obtener más información sobre los formatos de textura comprimidos, consulta Texture Block Compression in Direct3D 11 and Block Compression (Direct3D 10).

La biblioteca D3DX (por ejemplo, D3DX11.lib) y otras bibliotecas similares de forma incoherente o no proporcionan el valor de tono en el miembro dwPitchOrLinearSize de la estructura DDS_HEADER . Por lo tanto, al leer y escribir en archivos DDS, se recomienda calcular el tono de una de las maneras siguientes para los formatos indicados:

  • En el caso de los formatos comprimidos en bloques, calcule el tono como:

    max( 1, ((width+3)/4) ) * block-size

    El tamaño de bloque es de 8 bytes para formatos DXT1, BC1 y BC4, y 16 bytes para otros formatos comprimidos en bloques.

  • Para R8G8_B8G8, G8R8_G8B8, formatos empaquetados por UYVY heredados y empaquetados yuY2 heredados, calcule el tono como:

    ((width+1) 1) >> * 4

  • Para otros formatos, calcule el tono como:

    ( width * bits-per-pixel + 7 ) / 8

    Divida por 8 para la alineación de bytes.

Nota

El valor de inclinación que se calcula no siempre es igual al tono que proporciona el tiempo de ejecución, que está alineado con DWORD en algunas situaciones y alineado por bytes en otras situaciones. Por lo tanto, se recomienda copiar una línea de examen a la vez en lugar de intentar copiar toda la imagen en una copia.

Variantes de DDS

Hay muchas herramientas que crean y consumen archivos DDS, pero pueden variar en los detalles de lo que requieren en el encabezado. Los escritores deben rellenar los encabezados lo más completo posible y los lectores deben comprobar los valores mínimos para obtener la compatibilidad máxima. Para validar un archivo DDS, un lector debe asegurarse de que el archivo tenga al menos 128 bytes para acomodar el valor mágico y el encabezado básico, el valor mágico es 0x20534444 ("DDS"), el tamaño del DDS_HEADER es 124 y el DDS_PIXELFORMAT en el tamaño del encabezado es 32. Si el DDS_PIXELFORMAT dwFlags se establece en DDPF_FOURCC y dwFourCC se establece en "DX10", el tamaño total del archivo debe ser de al menos 148 bytes.

Hay algunas variantes comunes en uso en las que el formato de píxel se establece en un código DDPF_FOURCC donde dwFourCC se establece en un valor de enumeración D3DFORMAT o DXGI_FORMAT. No hay ninguna manera de indicar si un valor de enumeración es un D3DFORMAT o un DXGI_FORMAT, por lo que se recomienda encarecidamente que la extensión "DX10" y el encabezado DDS_HEADER_DXT10 se usen en su lugar para almacenar el dxgiFormat cuando el DDS_PIXELFORMAT básico no puede expresar el formato.

El DDS_PIXELFORMAT estándar debe ser preferido para la máxima compatibilidad con almacenar datos RGB sin comprimir y datos DXT1-5, ya que no todas las herramientas de DDS admiten la extensión DX10.

Usar matrices de texturas en Direct3D 10/11

Las nuevas estructuras DDS (DDS_HEADER y DDS_HEADER_DXT10) en Direct3D 10/11 amplían el formato de archivo DDS para admitir una matriz de texturas, que es un nuevo tipo de recurso en Direct3D 10/11. Este es un código de ejemplo que muestra cómo obtener acceso a los distintos niveles de mapa mip en una matriz de texturas mediante los nuevos encabezados.

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 comunes de recursos de archivo DDS y contenido de encabezado asociado

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
Cualquier formato DXGI DDS_FOURCC "DX10"

* = Un lector de DDS sólido debe ser capaz de controlar estos códigos de formato heredados. Sin embargo, este tipo de lector DDS debe preferir usar la extensión de encabezado "DX10" cuando escribe estos códigos de formato para evitar ambigüedad.

** = Debido a algunos problemas de larga duración en implementaciones comunes de lectores y escritores de DDS, la forma más sólida de escribir datos de 10:10:10:2 es usar la extensión de encabezado "DX10" con el código de DXGI_FORMAT "24" (es decir, el valor DXGI_FORMAT_R10G10B10A2_UNORM). D3DFMT_A2R10G10B10 los datos deben convertirse a datos de tipo 10:10:10:2 antes de escribirse como un archivo DDS de formato DXGI_FORMAT_R10G10B10A2_UNORM.

DDS