차이점

이 페이지의 선택한 이전 버전과 현재 버전 사이의 차이점을 보여줍니다.

차이 보기로 연결

s3텍스쳐압축 [2011-07-08 16:02] (현재)
lifthrasiir 새로 만듦
줄 1: 줄 1:
 +====== S3 텍스쳐 압축 ======
  
 +S3 Texture Compression (S3TC). [[텍스쳐]]에 특화된 [[손실압축]] [[알고리즘]]으로, 좀 더 정확하게는 DXT1~DXT5까지의 다섯 종류의 거의 비스무리하지만 서로 다른 알고리즘들을 묶어 이른다. 좀 심하게 말하면 압축이라기보다는 [[양자화]]된 이미지를 어떻게 비트로 묶어 표현할까 하는 포맷에 불과하며, 비슷한 아이디어는 이전에도 꽤 존재하고 있었다(1970년대의 block truncation coding 같은 기법은 이 알고리즘을 1비트 테이블에 적용한 것이라 할 수 있다).
 +
 +[[DirectX]](DXTC)와 [[OpenGL]](''[[http://oss.sgi.com/projects/ogl-sample/registry/EXT/texture_compression_s3tc.txt|GL_EXT_texture_compression_s3tc]]'' 확장)에서 모두 지원하며, 그런 주제에 [[소프트웨어특허]]가 걸려 있어서(...) [[애플사]] 등이 [[데꿀멍]]하는 데 공헌했다(([[http://www.prnewswire.com/news-releases/itc-judge-rules-that-apple-infringes-two-s3-graphics-patents-124892519.html|ITC Judge Rules That Apple Infringes Two S3 Graphics Patents]] (PR Newswire, 2011-07-01) )). 거의 [[marching cubes]] 알고리즘과 비슷한 정도의 [[민폐]]를 끼치고 있다고 봐도 될 듯. 본래 특허권은 S3 그래픽스에게 있었으나, 현재는 [[HTC]]에 인수된 상태이다.
 +
 +===== 상세 =====
 +
 +모든 S3 텍스쳐 압축 알고리즘은 본래대로라면 384비트([[RGB]])나 512비트([[RGBA]])로 표현해야 하는 4×4 픽셀 블록을 64비트(DXT1) 또는 128비트(DXT2~5)로 압축하는 방법이다. 따라서 압축률은 항상 일정하며(4:1이거나 6:1) 메모리 접근을 예측하기 매우 쉽기 때문에 [[병렬화]]나 최적화에 유리하다. 6:1 압축률을 사용할 경우 어떤 텍스쳐는 텍스쳐를 가로 세로 두 배로 늘리고서 크기가 원래보다 줄어 드는 기적도 보일 수 있다. 물론 블록 안의 색깔이 간단하게 양자화가 안 된다면 정확도는 매우 떨어진다.
 +
 +실제 포맷은 다음과 같이 구성된다:
 +
 +  * **DXT1**: [[16비트색상|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$$의 범위에 따라 다음과 같이 정의된다:
 +    * $$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_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에서는 지원하지 않는다.
 +
 +{{tag>압축알고리즘}}

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