DXT 압축
반응형
우선 기본적으로 PC게임에서 DXT(DirectX Texture) 픽셀 포맷을 많이 사용한다.
이 DXT 포맷은 Direct3D API 표준이며 이름 또한 DirectX Texture 이다.
그렇다면 이 DXT는 어떤 장점이 있고 어떤 특성이 있기에 DX에서 표준이 되었을까?
DXT픽셀 포맷을 저장하는데 사용되는 DDS 파일포맷이란 무었인가?
DDS(DirectDraw Surface)
이 파일 포멧은 텍스쳐 매핑과 큐브맵 환경맵을 저장하는데 쓰이는 마이크로스프트사의 포멧이며,
GPU에 쓰이는 DXTn으로 압축된 데이터를 저장하는데 유용하다.
이 파일 포멧은 DirectX 7.0에 도입되었으며 원래 DirectX를 위해 설계되었으며 밉맵,
큐브맵, 볼륨맵을 지원한다.
이 파일 포맷은 압축 및 비압축 픽셀 형식을 저장할 수 있으며 PC게임에서 DXTn 압축 픽셀 포맷을
저장하기위해 주로 사용한다.
추가 설명은 Programming Guide for DDS를 참조하면 된다.
DXT를 쓰는 이유는?
1. 압축률이 높다 : 메모리를 적게쓴다.
2. 성능저하가 거의 없다. : 거의 모든 그래픽 카드가 하드웨어 레벨에서 DXT포맷을 지원한다.
3. 퀄리티가 나름 괜찮다. (그라데이션있는 텍스쳐나 노말 텍스쳐에는 비츄)
DXT 압축 방식은?
DXT(DirectX Texture)는 소프트웨어 기반의 경량 압축기법으로 각 프레임 내에서 독립적인 4x4픽셀 블록 단위로
손실압축을 수행하며 압축비율은 4:1~8:1로 고정되어 있다.
DXT1의 기본 압축 알고리즘을 살펴보면 아래와 같은 순서로 진행된다.
1. 압축할 원본 이미지에서 4x4 픽셀 블록을 추출한다.
- 한 텍셀 read시 해당 텍셀이 포함된 16픽셀이 내부 비디오 캐시로 이동.
- 실제 렌더링시 Bilinear Filtering등 아주 근접한 텍스처를 읽어들이는 경향이 있음
- 렌더링 특성상 연속된 텍셀을 읽어들이는 경향이 있다.
- 다음에 해당 블럭 중에서 읽어들일 확률이 매우 높다. (Cache hit)
2. 픽셀 블록의 16개의 픽셀 중에서 최대값(흰색에 가까운 색)과 최소값(검은색에 가까운 색)을 구한다.
DXT압축으로 표현되는 색 해상도는 16비트(High Color, R5G6B5)이므로 24비트(R8G8B8) 색 해상도를
가지는 이미지는 16비트 색 해상도로 변환한다.
따라서 최대값(Color 0)과 최소값(Color 1)의 색 해상도를 변환(R5G6B5)하고
중간값 2개(Color2, Color3)를 계산한다.
이미지 참조 : http://kiise.or.kr/e_journal/2012/8/cpl/pdf/01.pdf
2개의 색상값(최대R5G6B5, 최소R5G6B5)을 저장하기 위해 필요한 32bit와 이 두 색상값에 대한
16개의 2BIT 인덱싱을 저장한다.
EX :
- 00 이라면 최대값
- 01이라면 최소값
- 10이라면 2/3 * 최대값 + 1/3 * 최소값
- 01이라면 1/3 * 최대값 + 2/3 * 최소값
이렇게 해서 색상값 2개 32bit와 인덱싱값 16개 32bit를 합쳐서 총 64bit가 된다.
dxt1 압축을 기준으로 24비트(R8G8B8) 텍스쳐의 경우 4x4 사이즈라면 3byte * 16 = 48byte가 필요하지만
dxt1 압축을 하면 64bit 즉, 8byte가 필요하다.
이를 이미지로 표현하면 아래와 같다.
이미지 참조 : https://www.slideshare.net/zho7611/ndc2012-12677111
Reference Link
'Study > Graphics ' 카테고리의 다른 글
normal mapping artifacts (0) | 2014.12.10 |
---|---|
tangent space, 접선 공간 (0) | 2014.04.07 |
BRDF (Bidrectional Reflectance Distributing Function) (0) | 2012.12.06 |
64박스 필터 샘플링 (0) | 2012.01.30 |
9콘 필터 샘플링 (0) | 2012.01.26 |
TAGS.