The DDS_PIXELFORMAT structure sits inside the
header, at offset 76 from the start of the file.
It either names a format with a four-character code or describes uncompressed pixels with
bit masks.
Fields
| File offset | Size | Name | Description |
|---|---|---|---|
| 76 | 4 | dwSize | Structure size: 32. |
| 80 | 4 | dwFlags | What kind of data the surface holds; see below. |
| 84 | 4 | dwFourCC | A four-character code for compressed or custom formats. DX10 means a DX10 header follows. |
| 88 | 4 | dwRGBBitCount | Bits per pixel, valid with DDPF_RGB, DDPF_LUMINANCE or DDPF_YUV. |
| 92 | 4 | dwRBitMask | Mask for red, or luminance, or Y. |
| 96 | 4 | dwGBitMask | Mask for green, or U. |
| 100 | 4 | dwBBitMask | Mask for blue, or V. |
| 104 | 4 | dwABitMask | Mask for alpha. |
dwFlags
| Flag | Value | Meaning |
|---|---|---|
DDPF_ALPHAPIXELS | 0x1 | The texture has alpha data, and dwABitMask is valid. |
DDPF_ALPHA | 0x2 | Older files: alpha-only uncompressed data. |
DDPF_FOURCC | 0x4 | dwFourCC is valid. |
DDPF_RGB | 0x40 | Uncompressed RGB data; the bit count and masks are valid. |
DDPF_YUV | 0x200 | Older files: uncompressed YUV data, with Y, U and V in the three masks. |
DDPF_LUMINANCE | 0x20000 | Older files: single-channel uncompressed data. Can be combined with DDPF_ALPHAPIXELS for two channels. |
Four-character codes
Microsoft’s table gives the following. Codes marked “legacy” are ones Microsoft says a
robust reader must be able to handle, while writers should prefer the
DX10 header.
| dwFourCC | Format | Note |
|---|---|---|
DXT1 | DXGI_FORMAT_BC1_UNORM, D3DFMT_DXT1 | |
DXT2 | D3DFMT_DXT2 | Premultiplied alpha |
DXT3 | DXGI_FORMAT_BC2_UNORM, D3DFMT_DXT3 | |
DXT4 | D3DFMT_DXT4 | Premultiplied alpha |
DXT5 | DXGI_FORMAT_BC3_UNORM, D3DFMT_DXT5 | |
BC4U | DXGI_FORMAT_BC4_UNORM | Legacy |
BC4S | DXGI_FORMAT_BC4_SNORM | Legacy |
ATI2 | DXGI_FORMAT_BC5_UNORM | Legacy |
BC5S | DXGI_FORMAT_BC5_SNORM | Legacy |
RGBG | DXGI_FORMAT_R8G8_B8G8_UNORM, D3DFMT_R8G8_B8G8 | |
GRGB | DXGI_FORMAT_G8R8_G8B8_UNORM, D3DFMT_G8R8_G8B8 | |
UYVY | D3DFMT_UYVY | |
YUY2 | D3DFMT_YUY2 | |
DX10 | Any DXGI format | The real format is in the DX10 header |
Numeric codes
A common variant sets dwFourCC directly to a D3DFORMAT or DXGI_FORMAT
enumeration value. There is no way to tell which enumeration a number belongs to, so
this is not recommended, but these values are widely written and Microsoft says readers
must handle them:
| Value | Format |
|---|---|
| 36 | DXGI_FORMAT_R16G16B16A16_UNORM, D3DFMT_A16B16G16R16 |
| 110 | DXGI_FORMAT_R16G16B16A16_SNORM, D3DFMT_Q16W16V16U16 |
| 111 | DXGI_FORMAT_R16_FLOAT, D3DFMT_R16F |
| 112 | DXGI_FORMAT_R16G16_FLOAT, D3DFMT_G16R16F |
| 113 | DXGI_FORMAT_R16G16B16A16_FLOAT, D3DFMT_A16B16G16R16F |
| 114 | DXGI_FORMAT_R32_FLOAT, D3DFMT_R32F |
| 115 | DXGI_FORMAT_R32G32_FLOAT, D3DFMT_G32R32F |
| 116 | DXGI_FORMAT_R32G32B32A32_FLOAT, D3DFMT_A32B32G32R32F |
| 117 | D3DFMT_CxV8U8 |
Uncompressed formats by mask
In these rows, dwFlags combines the flags above: RGB is
DDPF_RGB, RGBA adds DDPF_ALPHAPIXELS, ALPHA is
DDPF_ALPHA and LUMINANCE is DDPF_LUMINANCE.
| Format | dwFlags | Bits | Red mask | Green mask | Blue mask | Alpha mask |
|---|---|---|---|---|---|---|
DXGI_FORMAT_R8G8B8A8_UNORM, D3DFMT_A8B8G8R8 | RGBA | 32 | 0xFF | 0xFF00 | 0xFF0000 | 0xFF000000 |
DXGI_FORMAT_R16G16_UNORM, D3DFMT_G16R16 | RGBA, RGB | 32 | 0xFFFF | 0xFFFF0000 | ||
DXGI_FORMAT_R10G10B10A2_UNORM, D3DFMT_A2B10G10R10 | RGBA | 32 | 0x3FF | 0xFFC00 | 0x3FF00000 | |
DXGI_FORMAT_B5G5R5A1_UNORM, D3DFMT_A1R5G5B5 | RGBA | 16 | 0x7C00 | 0x3E0 | 0x1F | 0x8000 |
DXGI_FORMAT_B5G6R5_UNORM, D3DFMT_R5G6B5 | RGB | 16 | 0xF800 | 0x7E0 | 0x1F | |
DXGI_FORMAT_A8_UNORM, D3DFMT_A8 | ALPHA | 8 | 0xFF | |||
D3DFMT_A8R8G8B8 | RGBA | 32 | 0xFF0000 | 0xFF00 | 0xFF | 0xFF000000 |
D3DFMT_X8R8G8B8 | RGB | 32 | 0xFF0000 | 0xFF00 | 0xFF | |
D3DFMT_X8B8G8R8 | RGB | 32 | 0xFF | 0xFF00 | 0xFF0000 | |
D3DFMT_A2R10G10B10 | RGBA | 32 | 0x3FF00000 | 0xFFC00 | 0x3FF | 0xC0000000 |
D3DFMT_R8G8B8 | RGB | 24 | 0xFF0000 | 0xFF00 | 0xFF | |
D3DFMT_X1R5G5B5 | RGB | 16 | 0x7C00 | 0x3E0 | 0x1F | |
D3DFMT_A4R4G4B4 | RGBA | 16 | 0xF00 | 0xF0 | 0xF | 0xF000 |
D3DFMT_X4R4G4B4 | RGB | 16 | 0xF00 | 0xF0 | 0xF | |
D3DFMT_A8R3G3B2 | RGBA | 16 | 0xE0 | 0x1C | 0x3 | 0xFF00 |
D3DFMT_A8L8 | LUMINANCE | 16 | 0xFF | 0xFF00 | ||
D3DFMT_L16 | LUMINANCE | 16 | 0xFFFF | |||
D3DFMT_L8 | LUMINANCE | 8 | 0xFF | |||
D3DFMT_A4L4 | LUMINANCE | 8 | 0xF | 0xF0 |
For 10:10:10:2 data, Microsoft says the most robust choice is the DX10
header with format 24, because of long-standing inconsistencies in how other software
reads the masks. D3DFMT_A2R10G10B10 data should be converted first.