S3 Texture Compression (S3TC). 텍스쳐에 특화된 손실압축 알고리즘으로, 좀 더 정확하게는 DXT1~DXT5까지의 다섯 종류의 거의 비스무리하지만 서로 다른 알고리즘들을 묶어 이른다. 좀 심하게 말하면 압축이라기보다는 양자화된 이미지를 어떻게 비트로 묶어 표현할까 하는 포맷에 불과하며, 비슷한 아이디어는 이전에도 꽤 존재하고 있었다(1970년대의 block truncation coding 같은 기법은 이 알고리즘을 1비트 테이블에 적용한 것이라 할 수 있다).
DirectX(DXTC)와 OpenGL(GL_EXT_texture_compression_s3tc
확장)에서 모두 지원하며, 그런 주제에 소프트웨어 특허가 걸려 있어서(…) 애플사 등이 데꿀멍하는 데 공헌했다1). 거의 Marching cubes 알고리즘과 비슷한 정도의 민폐를 끼치고 있다고 봐도 될 듯. 본래 특허권은 S3 그래픽스에게 있었으나, 현재는 HTC에 인수된 상태이다.
모든 S3 텍스쳐 압축 알고리즘은 본래대로라면 384비트(RGB)나 512비트(RGBA)로 표현해야 하는 4×4 픽셀 블록을 64비트(DXT1) 또는 128비트(DXT2~5)로 압축하는 방법이다. 따라서 압축률은 항상 일정하며(4:1이거나 6:1) 메모리 접근을 예측하기 매우 쉽기 때문에 병렬화나 최적화에 유리하다. 6:1 압축률을 사용할 경우 어떤 텍스쳐는 텍스쳐를 가로 세로 두 배로 늘리고서 크기가 원래보다 줄어 드는 기적도 보일 수 있다. 물론 블록 안의 색깔이 간단하게 양자화가 안 된다면 정확도는 매우 떨어진다.
실제 포맷은 다음과 같이 구성된다:
DXT1:
16비트(5:6:5 RGB) 색깔
c_0과
c_1, 그리고 각 2비트짜리 4×4 룩업 테이블
x_{00}\cdots x_{33}으로 구성되어 있다(합해서 64비트). 실제 색상
C_{ij} = c_{x_{ij}}로 계산되는데, 여기서
c_2와
c_3은
c_0/
c_1의 범위에 따라 다음과 같이 정의된다:
DXT3: 16비트 색깔 c_0과 c_1, 2비트짜리 4×4 룩업 테이블 x_{00}\cdots x_{33}, 그리고 4비트짜리 4×4 알파 테이블 a_{00}\cdots a_{33}로 구성된다. 실제 색상 C_{ij}와 알파 \alpha_{ij}는 다음과 같다:
C_{ij} = c_{x_{ij}}, 여기서 c_2 = \frac23 c_0 + \frac13 c_1이고 c_3 = \frac13 c_0 + \frac13 c_1. (DXT1에서 c_0 > c_1인 경우와 같음)
\alpha_{ij} = \frac1{15} a_{ij}.
DXT5: 16비트 색깔 c_0과 c_1, 2비트짜리 4×4 룩업 테이블 x_{00}\cdots x_{33}, 8비트 알파 a_0과 a_1, 그리고 3비트짜리 4×4 룩업 테이블 y_{00}\cdots y_{33}으로 구성된다. c_0/c_1/x_{ij}는 DXT3과 동일하며, 실제 알파 \alpha_{ij} = \frac1{255} a_{y_{ij}}로 계산되는데, 이 역시 a_2\cdots a_7은 a_0과 a_1의 범위에 따라 다음과 같이 정의된다:
a_0 > a_1일 경우, 1 \le k \le 6에 대해 a_{k+1} = (1-\frac{k}{7}) a_0 + \frac{k}{7} a_1.
a_0 \le a_1일 경우, 1 \le k \le 4에 대해 a_{k+1} = (1-\frac{k}{5}) a_0 + \frac{k}{5} a_1이고, a_6 = 0, a_7 = 1.
DXT2와 DXT4는 DXT3과 DXT5와 동일하지만 색상 부분에서 미리곱한알파 포맷을 사용한다. 이 포맷은 DirectX 10과 OpenGL에서는 지원하지 않는다.