ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • BCn Texture Compression Formats 정리
    Graphics/기본 2023. 4. 21. 01:45

     

    목차

    1. 개요
    2. 내용
     2.1. BCn 포맷의 공통 특징
      2.1.1 BCn 의 블록에는 두 가지 주요 데이터
     2.2. BC1
      2.2.1. BC1 블록 레이아웃
     2.3. BC4

      2.3.1. 두 가지 모드
     2.4. BC2, BC3 그리고 BC5

      2.4.1. BC3 (BC1 + BC4)
      2.4.2. BC5 (BC4 + BC4)
      2.4.3. BC2
     2.5. BC6, BC7

      2.5.1. BC7
      2.5.2. BC6
    3. 레퍼런스

     

    1. 개요

    레퍼런스1의 BCn 설명을 읽어보고 각 포맷의 특징을 요약하는 것을 목표로 합니다.

     

    2. 내용

    그림1. 전체 BCn 포맷의 요약 (출처 : 레퍼런스1)

     

    2.1. BCn 포맷의 공통 특징

    BCn 형식은 모두 4x4 픽셀 블록을 사용하며, 형식에 따라 각 블록은 8 byte or 16 byte

    그림2. 4x4 픽셀을 한개의 블록으로 압축함 (출처 : 레퍼런스1)

     

    2.1.1. BCn 의 블록에는 두 가지 주요 데이터

    • RGB 생상공간에 있는 선분의 양 끝점(EndPoints)
    • 각 픽셀이 선분을 따라 얼마나 멀리 떨어져 있는지를 나타내는 Index

    그림3. RGB 공간내의 양끝점과, 양끝점 사이의 보간된 픽셀에 Index 를 붙임. 그리고 이 모든 픽셀들을 블록의 Palette 가 가진 픽셀로 취급 (출처 : 레퍼런스1)

     

    대부분의 BCn 형식은 세 가지 매우 다른 색상이 단일 블록에 있는 경우 품질이 좋지 않은 결과를 제공함.

    • 예를 들면, 빨강, 녹색, 파랑이 혼합된 블록은 RGB 공간에서 직선을 따라 배치되어 있지 않기 때문임. 노멀맵도 각 축이 독립된 데이터이기 때문에 비슷한 문제가 발생가능

     

    그림4, 5에서 각 블록이 어떻게 4개 이하의 고유 색상으로 축소되고(BC1 은 4색 팔레트 사용) 미묘한 색(Hue) 변화가 사라졌는지 확인할 수 있음. (어두운 영여과 밝은 영역 사이 참고)

    그림4. 원본과 BC1 로 압축된 블록의 비교 (출처 : 레퍼런스1)
    그림5. 원본과 BC1 압축의 비교, 그림자가 진 부분이나 색이 급격하게 변하는 부분에 티가 (출처 : 레퍼런스1)

     

    2.2. BC1

    • RGB, RGBA 2가지 모드를 제공하며, RGBA 의 경우 알파채널을 1 bit 사용(투명 or 불투명만 나타낼 수 있음)
    • 4x4 블록을 8 byte 에 저장하기 때문에 Data rate 는 0.5 byte/px
      • 0.5 byte * (4x4) ⇒ 8 byte 이기 때문
      • EndPoints
        • RGB 5:6:5 형식을 사용하므로 2 byte 이며, 양 끝점이기 때문에 2개임. 총 4 byte
        • 그림6 를 보면 BC1 에서 녹색 밴드를 볼 수 있는데 5:6:5 인코딩이 (57, 60, 57) 와 같은 색상을 제공하기 때문에 녹색이 눈에 띔.
      • Palette
        • EndPoints 를 기준으로 4개의 색상을 뽑아냄. 2개는 EndPoints, 2개는 EndPoints 를 보간하여 구한 색상
        • 이 Palette 내의 4개 색상을 인덱싱 하기 위해서는 2 bit 필요 (총 4개의 색상이 있기 때문)
        • 2 bit * (4x4) = 32 bit = 4 byte
      • EndPoints 와 Palette 의 Index에 사용되는 총 byte 는 총 8 byte

    그림6. 원본과 BC1 의 그라데이션 비교. BC1 의 경우 RGB 5:6:5 bit 를 사용하기 때문에 녹색의 밴딩이 더 두드러짐 (출처 : 레퍼런스1)

     

    2.2.1. BC1 블록 레이아웃

    • RGB 모드인 경우
      • Palette 에 들어가는 색상 정보
        • color_0 (Index 00) : EndPoints 의 최소 색
        • color_1 (Index 01) : EndPoints 의 최대 색
        • color_2 (Index 10) : 2/3 * color_0 + 1/3 * color_1
        • color_3 (Index 11) : 1/3 * color_0 + 2/3 * color_1
    • RGBA 모드인 경우 (A 에 1 bit 를 사용해야 함)
      • Palette 에 들어가는 색상 정보(color_3 을 알파채널로 사용)
        • color_0 (Index 00) : EndPoints 의 최소 색
        • color_1 (Index 01) : EndPoints 의 최대 색
        • color_2 (Index 10) : color_2 = 1/2color_0 + 1/2color_1
        • color_3 (Index 11) : 0은 투명, 1은 불투명
    • 그림7의 a~p 는 4x4 픽셀이 Palette 에서 참조하는 Index 기록

    그림7. BC1 블록의 레이아웃 (출처 : 레퍼런스2)

    2.3. BC4

    • 단일 채널 색상 A 만 저장하며, 블록당 8 byte 사용
      • EndPoints 에는 각각 1 byte, 총 2 byte 사용
      • Palette 에는 8 개의 요소가 있음
        • 8 개의 요소를 Index로 가리켜야 하기 때문에 Index당 3 bit 필요
        • 3 bit * 4x4 = 48 bit = 6 byte
      • 그래서 EndPoints 와 Palette Index 총 합 8 byte
    • Palette 에 더 많은 요소들이 있기 때문에 BC1 보다 훨씬 더 나은 품질을 제공함
      • Height map, gloss map 기타 모든 종류의 그레이스케일 텍스쳐를 위한 탁월한 선택!
    • 그림8 의 비압축 텍스쳐와 비교해 봤을 때 눈에 띄는 차이가 거의 없음

    2.3.1. 두 가지 모드

    • 모드1 : 첫 번째 끝점이 두 번째 끝점보다 숫자가 큰 경우
      • Palette 에 들어가 있는 8개 요소들이 EndPoints 사이에 균등한 간격으로 배치됨
    • 모드2 : 두 번째 끝점보다 첫 번째 끝점보다 숫자가 큰 경우
      • Palette 에 들어가 있는 처음 6 요소는 EndPoints 사이에 균등한 간격으로 배치됨
      • 남은 2 요소는 각각 0과 255 (완전 검정색과 흰색) 을 나타내는데 사용함.
        • 이 모드를 사용하면 완전 검정색과 흰색을 표현할 수 있기 때문에 완전 검정과 흰색 영역 사이의 날카로운 가장자리를 표현하는 경우 더 나은 품질을 얻을 수 있음

    그림8. 원본과 BC4 포맷의 비교, 차이를 찾기 힘들정도로 좋은 품질을 보여 (출처 : 레퍼런스1)

     

    2.4. BC2, BC3 그리고 BC5

    • 이 형식들은 이전에 본 BC1 과 BC4 의 조합

    2.4.1. BC3 (BC1 + BC4)

    • RGBA 채널을 사용하며, 블록의 크기는 16 byte
      • RGB 채널에는 BC1 사용, 8 byte.
        • 알파채널이 따로 있기 때문에 BC1 의 알파채널 모드 사용 안 함
      • 알파 채널에는 BC4 를 사용함, 8 byte
    • 이미지와 함께 Height map, gloss map 과 같은 고품질 그레이스케일 이미지를 사용할 수 있음

    2.4.2. BC5 (BC4 + BC4)

    • 2개의 채널을 가지며, BC4 2개로 구성됨, 블록의 크기는 16 byte
    • 노멀맵에 유용 : X, Y 구성요소가 저장되고 Z 구성요소가 픽셀 쉐이더에서 만들어짐
      • X, Y 가 독립적인 데이터이기 때문에, 각 X, Y채널이 고유한 EndPoints 와 Index가 있다면 품질 상승 가능

    2.4.3. BC2

    • RGBA 채널을 사용하며, 블록의 크기는 16 byte
      • RGB 채널에는 BC1 을 사용, 8 byte
      • A 채널은 4 bit 를 사용해 총 16 단계를 표현함. (EndPoints 와 Index를 저장하지 않고 명시적인 값을 사용)
        • 4 bit * 4x4 = 64 bit = 8 byte
        • 16 단계의 알파 값을 가질 수 있기 때문에 극단적인 밴딩이 발생함
    • 거의 사용하지 않는 타입, BC3 가 더 나은 선택임. 같은 블록 크기 16 byte 에 더 나은 A 채널 품질을 가지기 때문

     

    2.5. BC6, BC7

    • D3D11 이상에서만 지원되며, 기존 형식들보다 복잡함
      • Palette 크기 및 EndPoints 가 저장되는 방식과 같은 세부 사항을 변경하는 다양한 모드가 있기 때문에 복잡
        • EndPoints 정밀도와 Index 정밀도 절충
          • Palette 가 더 크기만 정밀도가 낮은 EndPoints 를 저장
          • 더 높은 정밀도의 EndPoints 가 있지만 Palette 가 더 작음
      • 블록 내에 둘 이상의 선분을 포함할 수 있음 (모드에 따라 선분 수 결정)
        • Partitioning 이라는 개념을 도입하여, 블록 내의 서로 다른 픽셀에 대해서 서로 다른 선분을 사용할 수 있게 함.
          • 각 RGB 채널당 한 줄의 선분을 만들 수 있어서 품질이 향상됨
    • 둘 다 블록당 16 byte 를 사용함

    2.5.1. BC7

    • 8 bit RGB 또는 RGBA 데이터를 대상으로 함

    2.5.2. BC6

    • RGB half precision floating-point 데이터를 대상으로 함
    • HDR 이미지를 기본적으로 저장할 수 있는 유일한 BCn 형식

    그림9. 원본과 BC7 의 비교, 약간 차이가 있지만 그림4의 BC1 에 비해 우수한 품질임 (출처 : 레퍼런스1)
    그림10. 원본과 BC7의 비교, 원본과 거의 차이가 없음. 그림5의 BC1 포맷에 비해서 색이 급격하게 변하는 지점에서 품질이 좋음 (출처 : 레퍼런스1)
    그림11. 원본과 BC7 의 그라데이션 비교, 그림6의 BC1 의 그라데이션 비교에 비해서 상당히 좋은 품질을 보여줌 (출처 : 레퍼런스1)

     

     

    3. 레퍼런스

    1. Understanding BCn Texture Compression Formats

    2. 블록 압축(Direct3D 10)

     

    'Graphics > 기본' 카테고리의 다른 글

    Bindless Resource - DX12, Vulkan  (0) 2024.01.17
    DX12 Shader Visible Descriptor Heap  (0) 2023.08.05
    Wave Intrinsics  (0) 2022.09.27
    Variable Shading Rate(VRS)  (2) 2022.09.27
    Halfspace Fog 공식 유도 정리 - 흡수와 산란 응용  (2) 2022.03.22

    댓글

Designed by Tistory & scahp.