1. 개요
S3 Graphics에서 자사의 Savage3D 그래픽 카드용으로 개발한 텍스처 압축 포맷이다.2. 상세
DirectX 6.0과 OpenGL 1.3에서 라이선스한 것을 시작[1]으로, 닌텐도의 게임큐브와 마이크로소프트의 엑스박스를 시작(플레이스테이션 시리즈는 플레이스테이션 3부터 채택되었다[2])으로 콘솔에도 채택되면서 PC와 콘솔 게임의 텍스처 압축 포맷의 사실상 표준에 가까운 지위를 누리고 있는 포맷. 세부 포맷으로 DXT1부터 DXT5까지 존재하나 대부분 알파 채널이 없는 텍스처는 DXT1, 있는 텍스처는 DXT5를 사용한다.이 포맷의 압축 알고리즘은 S3가 특허로 등록했기 때문에, 2000년대 이후 S3는 사실상 GPU 경쟁에서 도태되어 몰락했지만 워낙에 많이 사용되는 이 포맷 때문에 라이센스비 챙겨가는것 만으로 먹고 살았으며, 이를 노리고 VIA나 HTC등에서 회사를 인수했을 정도. 2017년에 특허가 만료되었다.
3. 기본 원리
S3TC 알고리즘의 기본 원리는 이미지를 4x4 의 16픽셀으로 나눠서 64bit 또는 128bit 블럭으로 변환하는 것이다. 각 블럭은 2개의 색 극단값(color endpoint)을 가지며 각 픽셀의 색은 두 극단값 사이에 있는 색으로만 표현된다. 이러한 특성 때문에 각 블럭은 굉장히 제한된 개수의 색[3]만 사용할 수 있고, 그렇기에 그라데이션이 많은 이미지나 색이 많이 사용된 이미지에 사용하기는 부적절하다.[4] 하지만 일반적인 텍스쳐에선 납득이 갈 수준의 이미지 질 저하를 보여줘 광범위하게 사용되고 있다.좌측부터, 원본, S3TC (DXT1)로 압축된 Tangent 맵 |
4. 종류
4.1. DXT1
DirectX 10 이상에선 BC1이라고도 불린다. 가장 기본적인 형식으로, 16픽셀 데이터를 64bit블럭으로 변환한다. 각 블럭은 두개의 16비트 RGB 5:6:5 색상 극단값과 각 픽셀당 2비트씩, 총 32bit의 테이블을 가져 총 4개의 색상을 이용할 수 있다. 두개의 색 극단값을 각각 [math(c_0)], [math(c_1)]이라 할 때 [math(c_0 > c_1)]또는 [math(c_1 > c_0)]의 2가지 경우의 수가 존재하게 되는데, DXT1 포맷에서는 이 두가지 경우의 수를 나눠서 1bit 알파 색상을 지원한다.먼저 [math(c_0 > c_1)]일 경우, 블럭에서는 두 극단값과 그 사이의 값 2개를 이용한다. 이 값 2개를 [math(c_2)], [math(c_3)]라 하면, [math(c_2={\dfrac 23}c_0+{\dfrac 13}c_1)], [math(c_3={\dfrac 13}c_0+{\dfrac 23}c_1)] 이 된다.
그 다음 [math(c_1 > c_0)]일 경우에는 [math(c_2={\dfrac 12}c_0+{\dfrac 12}c_1)]이고, [math(c_3)]은 투명색으로 지정된다.
이러한 압축방식으로 DXT1은 32bit RGBA 이미지 기준 1:8의 훌륭한 압축률을 보여줘 많은 경우에 사용되고 있다. 다만 제대로된 알파색상을 지원하지 않기 때문에 주로 알파 채널이 없는 이미지를 압축할때 쓰인다.
4.2. DXT2, DXT3
DirectX 10 이상에선 BC2라고도 불린다. 16픽셀 이미지를 128bit 블럭으로 변환한다. 색상값은 DXT1과 동일하게 저장되며, 각 픽셀당 4bit씩 총 64bit의 압축되지 않은 값으로 알파채널을 표현한다. DXT2과 DXT3 모두 이러한 방식으로 압축되며 두 형식의 차이는 이미지가 DXT3는 premultiplied alpha, DXT2는 straight alpha라고 가정하는 것 뿐이다. 실질적으로 거의 쓰이지는 않는형식이다.4.3. DXT4, DXT5
DirectX 10 이상에서는 BC3라고도 불린다. 16픽셀 이미지를 128bit 블럭으로 변환한다. BC2와 마찬가지로 색상값은 DXT1과 동일하게 압축되지만, 알파 채널도 샘플링을 거쳐 압축된다는 차이점이 있다. 알파 채널 압축은 색상 압축과 비슷한 방식으로 진행되며, 두개의 8bit 극단값과 픽셀당 3bit씩 총 48bit의 테이블을 가진다. 알파값 압축도 극단값의 순서에 따라 경우의 수를 나눠서 좀 더 정교한 알파 색상을 구현한다.DXT1 압축을 설명할 때과 마찬가지로 극단값을 [math(a_0)], [math(a_1)], 다른 색상들을 [math(a_n)](이 경우에는 테이블이 3bit이므로 [math(a_7)]까지)으로 표현해서 나타내면 먼저 [math(a_0 > a_1)]인 경우에는 [math(a_2={\dfrac 67}a_0+{\dfrac 17}a_1)], [math(a_3={\dfrac 57}a_0+{\dfrac 27}a_1)]과 같이 극단값 사이를 균등히 나눈 값으로 [math(a_7)]까지 표현된다.
반면 [math(a_1 > a_0)]인 경우에는 [math(a_6=0)], [math(a_7=255)]가 배정되며 나머지 값들은 [math(a_2={\dfrac 45}a_0+{\dfrac 15}a_1)], [math(a_3={\dfrac 35}a_0+{\dfrac 25}a_1)]와 같은 식으로 정해진다.
BC3에서처럼 DXT4, DXT5의 차이는 이미지를 DXT5는 premultiplied alpha, DXT4는 straight alpha라고 가정하는 것 뿐이다. DXT5가 좀 더 많이 쓰이고 있으며, 알파값이 필요한 텍스쳐의 사실상 표준으로 쓰이고 있다.
5. 기타
AMD에서 S3TC 형식들을 포함하고 좀 더 확장해서 BCn(Block Compression)을 개발했고 Direct X 10부터 표준에 채택되어 현재에 이르고 있다. BCn 포맷에는 위쪽에서 설명한 BC1~3과 그레이스케일 이미지를 지원하는 BC4(BC3의 알파 채널과 동일한 압축 방식으로 압축된다.)부터, DirectX 11에서 추가됐으며 BC3과 동일한 압축률로 더 고품질의 이미지를 구현하는 BC7까지의 포맷이 있다.각 포맷별 비교(유니티 엔진 문서)
6. 관련 문서
[1] DirectX 라이선스 버전은 DXTC(DirectX Texture Compression)라고 부른다. DirectX가 대세가 되면서는 사실상 이쪽 명칭이 원래 명칭보다 많이 불려지고 있다. 이 문서에서도 이 명칭을 사용한다.[2] PSP에서도 사용 가능했으나 실질적 사용 사례는 거의 없고, 대부분은 PlayStation 2처럼 8비트 팔레트 텍스처를 사용하였다.[3] 주로 4개나 8개로 표현된다[4] 노멀맵이나 깊이맵 같이 그라데이션으로만 이루어진 이미지를 이 방식으로 인코딩 하면 Blocking Artifact가 생기는 것을 볼 수 있다.