다음을 통해 공유


블록 압축

Windows 8.1 Direct2D는 여러 블록 압축 픽셀 형식을 지원합니다. 또한 Windows 8.1 블록 압축 이미지를 DDS 파일 형식으로 로드하고 저장할 수 있도록 하는 새로운 WIC(Windows 이미징 구성 요소) DDS 코덱을 포함합니다. 블록 압축은 비트맵 콘텐츠에서 사용되는 그래픽 메모리의 양을 줄이는 기술입니다. 블록 압축을 사용하면 앱에서 동일한 해상도 이미지에 대한 메모리 사용량 및 로드 시간을 줄일 수 있습니다. 또는 앱은 동일한 GPU 메모리 공간을 계속 사용하는 동안 더 많거나 높은 해상도의 이미지를 사용할 수 있습니다.

블록 압축은 Direct3D 애플리케이션에서 오랫동안 사용되어 왔으며 일반 및 Direct2D 애플리케이션 개발자도 Windows 8.1 사용할 수 있습니다.

이 항목에서는 블록 압축의 작동 방식과 WIC 및 Direct2D에서 블록 압축을 사용하는 방법을 설명합니다.

블록 압축 정보

BC(블록 압축)는 텍스처 크기를 줄이기 위한 압축 기술 클래스를 나타냅니다. Direct3D 11은 기능 수준에 따라 최대 7개의 BC 형식을 지원합니다. Windows 8.1 Direct2D에서는 모든 기능 수준에서 사용할 수 있는 BC1, BC2 및 BC3 형식을 지원합니다.

블록 압축 작동 방식

블록 압축 형식은 모두 동일한 기본 기술을 사용하여 색 데이터에 사용되는 공간을 줄입니다. 이 섹션에서는 가장 간단한 알고리즘인 BC1을 요약합니다. 자세한 설명은 블록 압축을 참조하세요.

먼저 이미지는 4x4픽셀의 블록으로 나뉩니다. 각 블록은 별도로 압축됩니다.

참고

즉, 이미지의 너비와 높이는 각각 4픽셀의 배수여야 블록 압축됩니다.

 

이 예제 이미지는 이미지 내의 4x4 픽셀 블록을 보여줍니다.

예제 이미지에는 이미지 내의 4x4 픽셀 블록이 표시됩니다.

다음으로 4 x 4 블록 내에서 두 개의 "참조" 색이 선택되고 2개의 16비트 값(5비트 빨간색, 6비트 녹색, 5비트 파랑)으로 인코딩됩니다. 이러한 색의 선택은 이미지 품질에 크게 영향을 줍니다. 두 중간 색은 RGB 색 공간에서 두 참조 색을 선형으로 보간하여 계산됩니다. 이렇게 하면 가능한 총 4가지 색이 생성됩니다. 각 색에는 2비트 인덱스 값이 할당됩니다. 그러나 보간이 고정될 때 두 개의 엔드포인트 색만 저장해야 합니다.

이 그림에서 색 0과 3은 블록의 "참조" 색으로 선택되고 색 1과 2는 선형 보간을 사용하여 계산됩니다.

블록을 나타내는 4색 값의 계산을 보여 주는 다이어그램

마지막으로 블록의 모든 픽셀은 이전에 계산된 4가지 색 중 하나에 매핑되고 각 픽셀은 두 비트 인덱스 값을 사용하여 인코딩됩니다.

이러한 16픽셀을 나타내는 데 사용되는 총 데이터 양은 다음과 같습니다.

16 bits [to define a reference color] * 2 + 2 bits * 16 [number of pixels] = 64 bits

그러면 픽셀당 평균 밀도가 4비트입니다. 비교를 위해 일반적인 DXGI_FORMAT_B8G8R8A8_UNORM 픽셀 형식은 픽셀당 32비트입니다.

이 다이어그램은 각 픽셀이 2비트 인덱스로 인코딩되었음을 보여줍니다. 전체 블록은 64비트로 인코딩됩니다.

4 색 값을 계산하여 블록을 나타냅니다.

알파 데이터와 다양한 수의 색 채널을 지원하는 변형이 있습니다. BC6H와 BC7은 HDR(High Dynamic Range) 콘텐츠를 지원하고 이미지 품질을 높이기 위해 크게 다른 알고리즘을 사용합니다.

DDS(DirectDraw Surface) 파일 형식

블록 압축 데이터는 일반적으로 DDS(DirectDraw Surface) 파일에 저장됩니다. Direct3D 개발자인 경우 DDS 파일에 익숙할 수 있습니다. Direct2D는 특정 DDS 기능만 지원합니다. 자세한 내용은 DDS 요구 사항을 참조하세요.

블록 압축의 이점

블록 압축 형식은 BC 형식이 기본적으로 최신 GPU에서 지원된다는 점에서 JPEG와 같은 일반적인 산업 이미지 압축 형식과 다릅니다. 즉, 디코딩 또는 압축 해제 없이 블록 압축 이미지를 GPU에 직접 로드할 수 있습니다. BC 형식은 픽셀당 평균 4~8비트에서 사용하며, 픽셀 BGRA 비트맵당 일반적인 압축되지 않은 32비트와 비교하면 메모리가 75%에서 87.5%로 절감됩니다. 또한 디코딩 단계가 없으므로 BC 이미지를 로드하는 시간이 JPEG와 같은 형식에 비해 크게 줄어듭니다.

블록 압축을 사용하는 경우

비트맵의 메모리 사용량을 줄이거나 디코딩 및 로드 시간을 줄이려면 JPEG와 같은 다른 형식 대신 앱에서 블록 압축 이미지를 사용하는 것이 좋습니다.

그러나 블록 압축은 모든 경우에 적합하지 않으며 약간의 절충이 필요합니다. 먼저 블록 압축 알고리즘은 손실됩니다. 블록 압축은 자연 사진 콘텐츠와 잘 작동하지만 컴퓨터에서 생성된 스크린샷과 같이 선명하고 고대비 경계가 있는 이미지에 원치 않는 시각적 아티팩트가 도입될 수 있습니다. 블록 압축 이미지 자산을 사용하기 전에 이미지 품질이 허용되는지 확인해야 합니다.

둘째, 블록 압축 DDS 파일은 일반적으로 비교 가능한 JPEG 이미지보다 디스크에 더 많은 공간을 사용합니다. 그러면 앱의 패키지 크기 및 네트워크 대역폭 요구 사항이 증가합니다.

블록 압축 사용

이 섹션에서는 Direct2D 앱에서 블록 압축 자산을 생성하고 사용하는 방법을 설명합니다.

개요

블록 압축 DDS 파일은 런타임 최적화 형식이므로 앱 런타임에서 뛰어난 성능을 위해 특별히 최적화되어 있습니다. 기존 자산 만들기 및 편집 파이프라인을 계속 사용하고 애플리케이션 프로젝트 또는 빌드 시 블록 압축 형식으로 변환하는 것이 좋습니다.

DDS 요구 사항

DDS 파일 형식은 Direct3D에 사용되는 다양한 기능을 지원하도록 설계되었습니다. Direct2D는 이러한 기능의 하위 집합만 사용합니다. 따라서 Direct2D에서 사용할 DDS 이미지를 만들 때는 다음 제한 사항에 유의해야 합니다.

  • 다음 DXGI_FORMAT 값만 허용됩니다.
    • DXGI_FORMAT_BC1_UNORM
    • DXGI_FORMAT_BC2_UNORM
    • DXGI_FORMAT_BC3_UNORM
  • 미리 곱한 알파 데이터를 사용해야 합니다. 여기에는 미리 곱한 알파(DXT1, DXT2, DXT4)를 명시적으로 정의하는 형식을 사용하는 레거시 DDS 파일과 DDS_ALPHA_MODE_OPAQUE 및 DDS_ALPHA_MODE_PREMULTIPLIED 값과 함께 DDS_HEADER_DX10 구조를 사용하는 DDS 파일이 포함됩니다.
  • X 및 Y 차원은 4픽셀의 배수여야 합니다.
  • 볼륨 텍스처, 큐브맵, 밉맵 또는 텍스처 배열은 허용되지 않습니다. 단일 프레임 원본 이미지만 사용해야 합니다.

블록 압축 자산 생성

블록 압축 DDS 파일을 만들거나 변환하는 데 사용할 수 있는 다양한 DDS 제작 도구가 있습니다. 이전 섹션에서 설명한 대로 모든 도구가 Direct2D에서 DDS 파일을 사용하기 위한 요구 사항을 지원하지는 않습니다.

Visual Studio 2013 시작하여 Visual Studio에서 JPEG 및 PNG와 같은 기존 시각적 자산을 빌드 프로세스의 자동 부분으로 올바른 DDS 블록 압축 형식으로 변환할 수 있습니다. 이 작업은 이미지 콘텐츠 작업 사용자 지정 빌드 단계를 사용하여 수행됩니다.

프로젝트에 대해 이 설정을 설정하는 방법에 대한 자세한 내용은 방법: Direct2D 또는 Javascipt 앱에서 사용할 텍스처 내보내기를 참조하세요.

Direct2D API

Direct2D는 다음 픽셀 형식을 지원하도록 Windows 8.1 업데이트됩니다.

  • DXGI_FORMAT_BC1_UNORM
  • DXGI_FORMAT_BC2_UNORM
  • DXGI_FORMAT_BC3_UNORM

이전 형식의 경우 미리 곱한 알파를 사용해야 합니다. 또한 이러한 형식은 대상이 아닌 원본으로만 사용할 수 있습니다. 예를 들어 이는 BC1을 사용하여 Direct2D 비트맵을 만들 수 있지만 디바이스 컨텍스트는 만들 수 없음을 의미합니다.

BC 형식을 지원하도록 다음 메서드가 Windows 8.1 업데이트됩니다.

CreateBitmapFromWicBitmapIWICBitmapSource를 인터페이스로 사용합니다. 그러나 Windows 8.1 WIC에서는 IWICBitmapSource에서 블록 압축 데이터 가져오기를 지원하지 않으며 DXGI_FORMAT_BC1_UNORM 해당하는 WIC 픽셀 형식은 없습니다. 대신 CreateBitmapFromWicBitmapIWICBitmapSource가 유효한 DDS IWICBitmapFrameDecode인지 확인하고 블록 압축 데이터를 직접 로드합니다. D2D1_BITMAP_PROPERTIES1 구조체에서 픽셀 형식을 명시적으로 지정하거나 Direct2D가 올바른 형식을 자동으로 확인하도록 허용할 수 있습니다.

Windows 이미징 구성 요소 API

WIC(Windows 이미징 구성 요소)는 Windows 8.1 새 DDS 코덱을 추가합니다. 또한 압축된 픽셀 데이터 차단을 포함하여 DDS 관련 데이터에 대한 액세스를 지원하는 새 인터페이스를 추가합니다.

압축된 WIC 픽셀 형식 차단

Windows 8.1 새로운 WIC 블록 압축 픽셀 형식이 없습니다. 대신 DDS 디코더에서 IWICBitmapFrameDecode 를 가져오고 CopyPixels를 호출하면 WICPixelFormat32bppPBGRA와 같은 표준 압축되지 않은 픽셀을 받게 됩니다. IWICDdsFrameDecode::CopyBlocks를 사용하여 DDS 파일에서 메모리 버퍼 형태로 원시 블록 압축 데이터를 가져올 수 있습니다.

다중 프레임 DDS 액세스

DDS 파일 형식을 사용하면 여러 관련 이미지를 단일 파일에 저장할 수 있습니다. 예를 들어 DDS 파일에는 큐브맵, 볼륨 텍스처 또는 텍스처 배열이 포함될 수 있으며, 이 배열은 모두 mipmapped가 될 수 있습니다. Direct3D에서 이러한 여러 이미지는 하위 리소스로 노출됩니다. WIC에서는 여러 이미지가 프레임으로 노출됩니다(IWICBitmapFrameDecodeIWICBitmapFrameEncode).

WIC는 프레임의 단일 차원 배열 개념만 지원하지만 DDS는 3개의 독립적인 차원을 지원합니다(한 파일에서 두 개만 사용할 수 있음). WIC는 DDS 하위 리소스와 WIC 프레임 간의 매핑을 지원하는 편리한 방법을 제공합니다. 디코딩의 경우 IWICDdsDecoder::GetFrame 을 사용하면 하위 리소스의 배열 인덱스, 밉 수준 및 조각 인덱스를 지정하고 올바른 WIC 프레임을 반환할 수 있습니다.

인코딩의 경우 IWICDdsEncoder::CreateNewFrame 은 새 프레임을 만들 때 결과 배열 인덱스, 밉 수준 및 조각 인덱스를 계산합니다. 먼저 IWICDdsEncoder::SetParameters 를 호출하여 DDS 관련 파일 매개 변수를 정의해야 합니다.

방법: Direct2D 또는 Javascipt 앱에서 사용할 텍스처 내보내기

DDS에 대한 참조

블록 압축