S3 텍스쳐 압축

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_0c_1, 그리고 각 2비트짜리 4×4 룩업 테이블 x_{00}\cdots x_{33}으로 구성되어 있다(합해서 64비트). 실제 색상 C_{ij} = c_{x_{ij}}로 계산되는데, 여기서 c_2c_3c_0/c_1의 범위에 따라 다음과 같이 정의된다:
    • c_0 > c_1일 경우, c_2 = \frac23 c_0 + \frac13 c_1이고 c_3 = \frac13 c_0 + \frac23 c_1.
    • c_0 \le c_1일 경우, c_2 = \frac12 c_0 + \frac12 c_1이고 c_3 = 0(검정색). 후자의 경우 RGBA 포맷에서는 알파값 \alpha_{ij} = 0으로도 사용된다(다른 경우 항상 \alpha_{ij} = 1).
  • DXT3: 16비트 색깔 c_0c_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_0c_1, 2비트짜리 4×4 룩업 테이블 x_{00}\cdots x_{33}, 8비트 알파 a_0a_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_7a_0a_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에서는 지원하지 않는다.


도쿠위키DokuWiki-custom(rev 9085d92e02)을 씁니다.
마지막 수정 2011-07-08 16:02 | 작성자 lifthrasiir