Notice
Recent Posts
Recent Comments
Link
반응형
«   2026/01   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

RenderLog

BCn Texture Compression Formats 정리 본문

Graphics/Graphics

BCn Texture Compression Formats 정리

scahp 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)

 

반응형