출처 giantjo님의 블로그 | 조진현
원문 http://blog.naver.com/giantjo/110043303453

 

개발을 하던 중에 디자이너분에게서 dds를 사용하죠?라는 질문을 간혹 들었습니다.

보통 답변하기를 메모리를 적게 점유해서 속도가 빠르다고 말해주는 게 고작이였습니다.

그리고 얼마가지 않아서 문제가 발생하게 되었습니다.

일반적인 텍스쳐가 모델에 입혀진 상태이고, 거기에 스티커 형태로 텍스쳐를 하나 더 입히는 기능이 있었는데, 이 부분의 최적화를 위해서 두 장의 텍스쳐를 합쳐서 한번만 그릴 수 있도록 하는 것이 저의 임무였습니다.

 

저는 간단한 일이라며, 코딩을 했었습니다.

텍스쳐에 락을 걸어서 바이트값을 읽었습니다.

이 두 장의 텍스쳐는 dds 포맷이였습니다.

텍스쳐를 읽다가 런타임 오류가 발생했씁니다.

저는 이 사건 이후에 dds가 압축 파일형태라는 것을 알게 되었습니다.

아마 대부분이 저와 비슷한 경험을 하지 않았을까 라고 생각합니다.

이론적으로 잘 알고 계셨다면 다행입니다.^^

 

일단 dds dxt 에 대한 용어에 대한 확실한 정의가 필요합니다.

dds 는 파일 포맷입니다. (JPG 와 같은)

반면 dxt 는 픽셀 포맷입니다.( A8R8G8B8 과 같은 )

dxt 의 종류로서 1~5번 사이가 존재하는 것입니다.

이와 관련된 내용은 gpg 같은 사이트에서 검색하면 잘 나오더군요.


굉장히 의아한 부분이 하나 있습니다.

압축을 하고, 풀면 시간이 걸릴 것입니다. 상식적으로도 색상 데이터를 그대로 쓰고 읽는 것이 제일 빠른데 왜 이런 압축을 사용해야 하는 것인지 말이죠.

아무래도 이것은 하드웨어의 발전과 무관할 수가 없는 것 같습니다.

빠른 속도로 하드웨어에 장착되는 메모리의 양은 증가하고 있지만, 그 메모리의 양만큼 메모리 대역폭은 그에 미치지 못하고 있는 것 같습니다.

( 메모리 대역폭이란 그래픽 보드 상에서 전송되는 메모리의 내용을 GPU 가 받아들일 수 있는 속도입니다 : Directx9 셰이더 프로그래밍 참고 )

 

그래서 하드웨어 제조사들은 대역폭을 줄이는 방법을 고민하던 중에 S3TC 라는 알고리즘을 채택한 것 같습니다. ( S3TC dxt 의 초장기 이름인 듯 합니다. )

S3TC 이외의 알고리즘도 존재합니다.

이는 자세히는 모르겠습니다.

결국 오늘 날의 아마 거의 모든 그래픽 카드는 이 S3TC 알고리즘을 장착해서 등장하고 있습니다. 그래서 우리는 DXT 라는 압축방법을 오늘날에 사용하고 있는 것이겠죠.

 

DDS 파일의 장점을 정리하자면( gpg study 참조 )

압축 포맷이기 때문에 메모리 양을 줄일 수 있으며, 이로 인해서 메모리 대역폭에 대한 부담도 줄일 수 있습니다.

비디오메모리에 바로 데이터가 올라가서 하드웨어상에서 압축을 풀기 때문에 성능에도 큰 무리가 없겠죠.^^

그리고 밉맵을 미리 생성해 둘 수 있기 때문에 역시 효율적이라 할 수 있습니다.

 

단점은 손실 압축이기 때문에 이미지 퀄리티에 손상이 있습니다.

 

그러면 과연 이 포맷은 어떻게 구현되어 있을까요?

저는 퀘이크로 유명한 id 아저씨들이 공개한 내용을 가지고 이 글을 전개합니다.

소스레벨 단위까지는 굳이 언급하지 않을 것입니다.

자세한 소스가 필요하신 분들은 아래 링크를 참고하시기 바랍니다.

 

http://cache-www.intel.com/cd/00/00/32/43/324337_324337.pdf



요약을 하자면,

일단 텍스쳐의 텍셀을 4*4 블록으로 추출합니다.

16개의 텍셀이 결국 4개의 색상과 16개의 인덱스를 구성하는 데이터로 변환되는 것이 바로 이 압축 알고리즘의 핵심입니다.

특히나 4개의 색상을 구하는 것이 가장 핵심입니다.

 

가장 빠른 방법은 각 색상 성분의 최대/최소를 구한 후 나머지 두 색상을 구하는게 가장 빠른거 같습니다.

아마도 연산 갯수가 적어서 일 것입니다.

이 경우에는 동시에 빨강, 파랑, 초록색을 표현할 수 없습니다.

( 리얼타임 렌더링 책에 언급하는 내용이 바로 이 부분인거 같습니다. )

 

왜냐하면 이들 세 색상이 있는 경우에는

각 성분의 최대/최소 값이 결국 검정색과 흰색이 나오기 때문이죠.

색상 성분의 영역을 구한다는 개념은 다음과 같습니다.

Red = 255, 0, 0   Green = 0, 255, 0   Blue = 0, 0, 255      ....

뭐 이런 경우인데

이 성분들이 4*4 텍셀의 성분으로 들어있다면,

결국 이 색상블럭의 RGB 영역은 모두 0 ~ 255 가 되는 것이죠.

각 텍셀별로 가장 크거나 작은 색상성분을 저장해두었다가 이를 활용하는 개념입니다.

 

이것을 방지하기 위해서는 다른 색상 추출 방법을 사용해도 됩니다.

물론 이 과정에서 성능을 중시할 것이냐, 퀄리티를 중시할 것이냐에 따라서 4개의 색상값을 도출하게 되는데, 일반적으로 dxt 알고리즘의 목적에 맞게 성능에 중시해서 설계가 된다고 생각합니다.


신고
by 흥배 2009.03.21 20:36
| 1 |

티스토리 툴바