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
- Variantes de DDS
- Usar matrices de texturas en Direct3D 10/11
- Formatos comunes de recursos de archivo DDS y contenido de encabezado asociado
- Temas relacionados
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.