다음을 통해 공유


DDS 프로그래밍 가이드

Direct3D는 압축되지 않거나 압축된(DXTn) 텍스처를 저장하기 위한 DDS 파일 형식을 구현합니다. 파일 형식은 다양한 형식의 데이터를 저장하도록 설계된 몇 가지 약간 다른 형식을 구현하고 단일 레이어 텍스처, 밉맵이 있는 텍스처, 큐브 맵, 볼륨 맵 및 텍스처 배열(Direct3D 10/11)을 지원합니다. 이 섹션에서는 DDS 파일의 레이아웃에 대해 설명합니다.

Direct3D 11에서 텍스처를 만드는 방법에 대한 도움말은 방법: 텍스처만들기를 참조하세요. Direct3D 9에 대한 도움말은 D3DX(Direct3D 9) 텍스처 지원을 참조하세요.

DDS 파일 레이아웃

DDS 파일은 다음 정보를 포함하는 이진 파일입니다.

  • 4개의 문자 코드 값 'DDS'(0x20534444)를 포함하는 DWORD(매직 넘버)입니다.

  • 파일의 데이터에 대한 설명입니다.

    데이터는 DDS_HEADER사용하여 헤더 설명과 함께 설명됩니다. 픽셀 형식은 DDS_PIXELFORMAT사용하여 정의됩니다. DDS_HEADERDDS_PIXELFORMAT 구조체는 사용되지 않는 DDSURFACEDESC2, DDSCAPS2 및 DDPIXELFORMAT DirectDraw 7 구조를 대체합니다. DDS_HEADER DDSURFACEDESC2 및 DDSCAPS2 해당하는 이진입니다. DDS_PIXELFORMAT DDPIXELFORMAT에 해당하는 이진입니다.

    DWORD               dwMagic;
    DDS_HEADER          header;
    
    

    DDS_PIXELFORMAT dwFlags가 DDPF_FOURCC 설정되고 dwFourCC가 "DX10"으로 설정된 경우 부동 소수점 형식, sRGB 형식 등과 같이 RGB 픽셀 형식으로 표현할 수 없는 텍스처 배열 또는 DXGI 형식을 수용하기 위해 추가 DDS_HEADER_DXT10 구조가 제공됩니다. DDS_HEADER_DXT10 구조체가 있으면 전체 데이터 설명은 다음과 같습니다.

    DWORD               dwMagic;
    DDS_HEADER          header;
    DDS_HEADER_DXT10    header10;
    
  • 주 표면 데이터를 포함하는 바이트 배열에 대한 포인터입니다.

    BYTE bdata[]
    
  • 와 같은 나머지 표면을 포함하는 바이트 배열에 대한 포인터입니다. mipmap 수준, 큐브 맵의 얼굴, 볼륨 텍스처의 깊이. 텍스처, 큐브 맵또는 볼륨 텍스처대한 DDS 파일 레이아웃에 대한 자세한 내용은 다음 링크를 따르세요.

    BYTE bdata2[]
    

광범위한 하드웨어 지원을 위해 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_UNORM또는 DXGI_FORMAT_BC3_UNORM_SRGB 형식입니다.

압축된 텍스처 형식에 대한 자세한 내용은 Direct3D 11 텍스처 블록 압축 및 블록 압축(Direct3D 10)참조하세요.

D3DX 라이브러리(예: D3DX11.lib) 및 기타 유사한 라이브러리는 DDS_HEADER 구조체의 dwPitchOrLinearSize 멤버에 피치 값을 안정적이지 않거나 일관되지 않게 제공합니다. 따라서 DDS 파일을 읽고 쓸 때 표시된 형식에 대해 다음 방법 중 하나로 피치를 계산하는 것이 좋습니다.

  • 블록 압축 형식의 경우 피치를 다음과 같이 계산합니다.

    max( 1, ((width+3)/4) ) * 블록 크기

    블록 크기는 DXT1, BC1 및 BC4 형식의 경우 8바이트, 다른 블록 압축 형식의 경우 16바이트입니다.

  • R8G8_B8G8, G8R8_G8B8, 레거시 UYVY로 가득 찬 및 레거시 YUY2로 압축된 형식의 경우 피치를 다음과 같이 계산합니다.

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

  • 다른 형식의 경우 다음과 같이 피치를 계산합니다.

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

    바이트 맞춤에 대해 8로 나눕니다.

메모

계산하는 피치 값이 런타임이 제공하는 피치와 항상 같지는 않습니다. 이 피치는 일부 상황에서는 DWORD로 정렬되고 다른 상황에서는 바이트 정렬됩니다. 따라서 전체 이미지를 한 복사본에 복사하는 대신 한 번에 스캔 줄을 복사하는 것이 좋습니다.

DDS 변형

DDS 파일을 만들고 사용하는 많은 도구가 있지만 헤더에 필요한 항목에 대한 세부 정보는 다를 수 있습니다. 작성기는 가능한 한 헤더를 완전히 채워야 하며 판독기는 최소값을 확인하여 최대 호환성을 확인해야 합니다. DDS 파일의 유효성을 검사하려면 판독기는 매직 값과 기본 헤더를 수용하기 위해 파일이 128바이트 이상이어야 하고, 매직 값은 0x20534444("DDS"), DDS_HEADER 크기는 124, 헤더 크기의 DDS_PIXELFORMAT 32입니다. DDS_PIXELFORMAT dwFlags가 DDPF_FOURCC 설정되고 dwFourCC가 "DX10"으로 설정된 경우 총 파일 크기는 148바이트 이상이어야 합니다.

픽셀 형식이 dwFourCC가 D3DFORMAT 또는 DXGI_FORMAT 열거형 값으로 설정된 DDPF_FOURCC 코드로 설정된 몇 가지 일반적인 변형이 있습니다. 열거형 값이 D3DFORMAT 또는 DXGI_FORMAT 알 수 없으므로 기본 DDS_PIXELFORMAT 형식을 표현할 수 없는 경우 "DX10" 확장 및 DDS_HEADER_DXT10 헤더를 대신 사용하여 dxgiFormat을 저장하는 것이 좋습니다.

표준 DDS_PIXELFORMAT RGB 압축되지 않은 데이터 및 DXT1-5 데이터를 저장하는 최대 호환성을 위해 선호되어야 합니다. 모든 DDS 도구가 DX10 확장을 지원하는 것은 아닙니다.

Direct3D 10/11에서 질감 배열 사용

Direct3D 10/11의 새 DDS 구조(DDS_HEADERDDS_HEADER_DXT10)는 DDS 파일 형식을 확장하여 Direct3D 10/11의 새로운 리소스 형식인 텍스처 배열을 지원합니다. 다음은 새 헤더를 사용하여 텍스처 배열의 다양한 Mipmap 수준에 액세스하는 방법을 보여 주는 몇 가지 샘플 코드입니다.

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++)
   {
     ...
   }
}       

일반적인 DDS 파일 리소스 형식 및 연결된 헤더 콘텐츠

리소스 형식 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
리소스 형식 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
모든 DXGI 형식 DDS_FOURCC "DX10"

* = 강력한 DDS 판독기는 이러한 레거시 형식 코드를 처리할 수 있어야 합니다. 그러나 이러한 DDS 판독기는 모호성을 방지하기 위해 이러한 형식 코드를 작성할 때 "DX10" 헤더 확장을 사용하는 것을 선호해야 합니다.

** = DDS 판독기 및 기록기의 일반적인 구현에서 몇 가지 오랜 문제로 인해 10:10:10:2 형식 데이터를 작성하는 가장 강력한 방법은 DXGI_FORMAT 코드 "24"(즉, DXGI_FORMAT_R10G10B10A2_UNORM 값)와 함께 "DX10" 헤더 확장을 사용하는 것입니다. D3DFMT_A2R10G10B10 데이터는 DXGI_FORMAT_R10G10B10A2_UNORM 형식 DDS 파일로 작성되기 전에 10:10:10:2 형식 데이터로 변환해야 합니다.

DDS