다음을 통해 공유


비트맵 블록 압축

CanvasBitmap는 압축된 비트맵 차단을 지원합니다. DDS 파일에서 로드하거나 CreateFromBytes(ICanvasResourceCreator,Byte[], Int32, Int32, DirectXPixelFormat)을 사용하여 만들 수 있습니다.

블록 압축 비트맵은 메모리를 적게 사용하고 더 효율적으로 그릴 수 있기 때문에 비트맵이 많은 애플리케이션(예: 게임)에 적합합니다. 블록 압축 비트맵은 압축되지 않은 비트맵 메모리의 최대 1/8의 메모리를 사용합니다. 따라서 GPU는 비트맵을 그릴 때 훨씬 적은 메모리에 액세스해야 하므로 그리는 속도가 빨라집니다.

블록 압축 정보

블록 압축은 PNG 또는 JPG 파일에서 사용하는 압축과 다릅니다. 압축된 파일 형식은 압축된 상태로 저장되지만 Win2D에 의해 로드되면 픽셀당 32비트(4바이트)를 사용하는 등 다음과 같은 형식의 비트맵(예:DirectXPixelFormat::B8G8R8A8UIntNormalized)으로 압축 해제됩니다. 따라서 256x256 비트맵은 256 * 256 * 4 = 262,144 바이트를 차지합니다.

블록 압축 비트맵은 4x4 픽셀 블록을 저장하기 위해 8 또는 16바이트(형식에 따라 나중에 자세히)를 사용합니다. 따라서 이 경우 256x256 비트맵은 256 * 256 / (4 * 4) * 8 = 32,768 바이트 또는 256 * 256 / (4 * 4) * 16 = 65,536 바이트를 차지합니다. 최대 8배 더 작습니다! 블록 압축은 GPU 하드웨어에서 직접 지원되므로 비트맵을 완전히 압축 해제하지 않고도 메모리에 압축된 상태로 유지하고 압축된 형식에서 바로 그릴 수 있습니다.

Win2D는 세 개의 블록 압축 형식을 지원합니다. 아래 표에서는 비교를 위해 압축되지 않은 형식과 함께 이러한 형식에 대해 설명합니다.

DirectXPixelFormat 4x4 비트맵의 크기 256x256 비트맵의 크기 알파
BC1Unorm 8바이트 32,768 바이트 1비트
BC2Unorm 16바이트 65,536 바이트 4 비트
BC3Unorm 16바이트 65,536 바이트 ~8비트(압축)
B8G8R8A8UintNormalized 64 바이트 262,144 바이트 8 비트

BC1Unorm, BC2UnormBC3Unorm는 알파를 지원하는 방법에 따라 크게 다릅니다. BC1은 1비트 알파만 지원합니다. BC2는 고유한 4비트 알파 값을 갖는 블록의 각 픽셀을 지원합니다. BC3은 알파 값을 압축합니다.

블록 압축 작동 방식에 대한 자세한 내용은 Direct2D 블록 압축 설명서Direct3D 블록 압축 설명서를 참조하세요.

제한 사항

  • 모든 블록 압축 텍스처는 너비와 높이가 4의 배수여야 합니다. 블록 압축은 4x4 픽셀 블록에서 작동하기 때문입니다.
  • 블록 압축 텍스처의 하위 사각형에 대한 모든 작업(GetPixelBytes(), , SetPixelBytes(Byte[])CopyPixelsFromBitmap(CanvasBitmap, Int32, Int32) 사용)은 하위 사각형이 4픽셀 정렬되어야 합니다.
  • Win2D에는 블록 압축 형식을 사용할 때 미리 곱한 알파가 필요합니다.

DDS 파일 작성

블록 압축 이미지는 DDS 파일에 저장할 수 있습니다. 포토샵이나 Paint.NET과 같은 애플리케이션의 플러그인을 통해 생성할 수 있지만, 결과 파일이 알파를 미리 곱한 상태로 저장되도록 주의해야 합니다. Win2D는 BC1Unorm, BC2Unorm 또는 BC3Unorm 이미지가 포함된 모든 DDS 파일을 로드하고 미리 곱한 알파로 작성되었다고 가정합니다.

C++ 프로젝트를 작성하는 경우 MSDN에 설명된 대로 이미지 콘텐츠 파이프라인을 사용하여 이미지를 변환할 수 있습니다.

또는 https://github.com/Microsoft/DirectXTex에서 texconv.exe 를 사용할 수 있습니다. texconv.exe는 DirectXTex_Desktop_2015.sln 솔루션을 사용하여 빌드할 수 있습니다. 다음 명령은 "smoke.png"을 알파를 미리 곱한 BC3Unorm로 변환합니다.

texconv -pmalpha -m 1 -f BC3_UNORM smoke.png