텍스쳐 메모리는 사실 그래픽 데이터 중 가장 큰 영역에 속합니다.
그리고 그 텍스쳐 파일 포맷은, DirectX 게임에서는 DXT 라고 하는 픽셀 포맷을 사용하는 DDS 파일 포맷으로 사용됩니다.
그래픽 데이터에서 이렇듯 큰 영역을 차지하고 있는 그래픽 데이터는, 결국 메모리를 차지하게 되고 이것들이 쌓여서 사양을 높이거나, 메모리 크기를 크게 못 쓰게 되거나 하게 되는 것입니다.
이 텍스쳐 메모리를 깐깐하게 줄이는 방법은 그래픽 디자이너들은 꼭 알고 있어야 하는 내용입니다.
제 수업 (월요일마다) 들으시는 분들은 이미 다 이해하신, 바로 그 내용입니다. 실무에 적용되는 예라고 할 수 있겠네요.
일단 픽셀 포맷을 볼까요? DDS 파일의 픽셀 포맷은 , 1강때 얘기한 내용에서와 같이 DXT1 ~DXT5 로 이루어져 있습니다.
자세한 설명을 지금 좔좔좔 하자면 너무 길어지니까…
설명을 듣고 싶으신 분들은 제 강의 들으시는 분께 물어보세요. (만약 잘 설명 못하면 저한테 이르세요. 감점시켜 버릴테닷)
어쨌건, 그냥 DDS 를 쓰면 저렇게 텍스쳐를 세부 옵션으로 정의할 수 있습니다만, 유니티에서는 PC에서 쓸 수 있는 DXT 포맷이 한계가 있습니다.
유니티에서 지원하는 DXT 텍스쳐 포맷을 보면…
| RGB Compressed DXT1 | Compressed RGB texture. This is the most common format for diffuse textures. 4 bits per pixel (32 KB for a 256x256 texture). 디퓨즈 텍스쳐에 권장되는 픽셀당 4비트 텍스쳐입니다. |
| RGBA Compressed DXT5 | Compressed RGBA texture. This is the main format used for diffuse & specular control textures. 1 byte/pixel (64 KB for a 256x256 texture). 압축된 RGBA 포맷입니다. 디퓨즈와 스페큘러 컨트롤때 쓰이는 텍스쳐 포맷입니다. (역주: 스페큘러 컨트롤을 알파 채널로 쓰게 기본 쉐이더에서 되어 있다는 얘기입니다) |
=========================================================================================================
요렇게 두 개밖에 없네요. DXT1과 DXT5. (개인적으로 DXT1 ARGB가 지원되었으면 좋겠는데…)
즉 알파가 없으면 DXT1을 쓰고, 알파가 있으면 DXT5를 쓰라는 것입니다.
이것은 모바일 버전에도 똑같습니다. 단, 모바일 버전에는 PVRTC 포멧을 사용한다는…
=============================================================================================================
| RGB Compressed PVRTC 2 bits | Compressed RGB texture. Supported by Imagination PowerVR GPUs. 2 bits per pixel (16 KB for a 256x256 texture) |
| RGBA Compressed PVRTC 2 bits | Compressed RGBA texture. Supported by Imagination PowerVR GPUs. 2 bits per pixel (16 KB for a 256x256 texture) |
| RGB Compressed PVRTC 4 bits | Compressed RGB texture. Supported by Imagination PowerVR GPUs. 4 bits per pixel (32 KB for a 256x256 texture) |
| RGBA Compressed PVRTC 4 bits | Compressed RGBA texture. Supported by Imagination PowerVR GPUs. 4 bits per pixel (32 KB for a 256x256 texture) (주: RGB가 아닌 RGBA인데도 RGB일때와 파일 크기가 똑같습니다. 그 얘기는 다른데서 색상을 줄였다는 얘기겠지요? 도움말에서 자세한 내용을 찾을 수는 없었습니다. ) |
==========================================================================================================
제 수업을 들어오신 분은 알겠지만, 2비트 칼라의 텍스쳐는 너무 깨져서 ‘굉장히 작아서 걍 있구나 라고 표현하면 될 텍스쳐’ 에 사용하면 좋을 포맷인걸 짐작하실 수 있으실 겁니다. 실제로도 그런 오브젝트가 꽤 있지요? 그 때 사용해 주시면 되겠습니다.
하지만 보통은 4비트 텍스쳐로, RGB (알파 없는것) RGBA (알파 있는것) 을 사용하겠지요. 4비트면 DXT 시리즈와 같은 파일 포맷이니까요.
이렇게 , 알파가 있고 없고에 따라서 사용하는 텍스쳐 포맷이 달라져야 합니다.
알파가 없어야 하는 것에 알파가 들어가면 DX 버전(PC버전) 에서는 256*256 사이즈의 텍스쳐일때 용량이 2배가 차이나게 됩니다.
이것은 왜냐면… DXT5 의 알파채널은 다른 채널과 다르게 혼자 8비트를 사용하기 때문입니다. 엄청나지요.
모바일버전에서는 일단 ARGB와 RGB가 같은 용량으로 나옵니다만, 수업했던 내용에 따르면, 이렇게 되면 반드시 A를 표현하기 위해서 RGB의 어느 부분을 빼버렸을 거란 말입니다. 색상이 줄게 되지요.
그러므로, 텍스쳐의 픽셀 포맷을 제대로 정하는 것은 메모리를 위해서 매우 중요한 일이 됩니다.
특히 모바일처럼 메모리의 양이 아주 민감한 경우에는 잘못하면 치명적이 될 수 있는 것이죠.
====================================================================================================
작업하신 분을 비난하려는 의도는 전혀 없지만, (누가 했는지도 몰라요…)
경각심을 불러 일으키고자 이런 예를 한두개 소개해 보겠습니다.
예를들어 현재 모바일에 들어가 있는 build_basecamp_03_01_mobile 이라는 텍스쳐를 보도록 하겠습니다.
이 파일은 512*512 라는 사이즈에 RGBA , DXT5 입니다. 알파 채널이 있다는 말이죠. 용량은 256KB 입니다.
그런데, 알파를 확인해 보면? 아무것도 없습니다! 전부 흰색, 즉 1 값이므로 이건 불투명한 이미지인 것입니다. 알파가 없어야 하는 이미지인 것이죠.
어째서 이런 일이 일어났을까요?
그것은 포토샵으로 tga를 세이브 할 때의 일입니다.
열심히 작업을 하신 후, 세이브할때
무심코 알파 채널이 생성되어 있었고, 그것을 다시 무심코 32비트로 저장하셔서 그렇습니다. 32비트라는 말은 알파 채널을 만들겠다는 말이니까요. (왜 그렇냐면 역시 강의 들으신 분들께 문의를…)
이렇게 되어서 저장하면, 이미지에는 필요없는 알파 채널이 생성되게 됩니다.
그런데 다행히 유니티에는 이걸 다시 수정해서 저장할 수 있는 기능이 들어 있습니다만…
대부분 그냥 자동으로 해 버리지요.
자동 옵션입니다. 이렇게 되면, 유니티는 ‘알파 채널이 있으니까 필요한 건가부다..’ 라고 생각하고 DXT5로 저장해 버리는 것입니다.
만약 실수로 이미지가 이렇게 들어왔다면, 유니티에서 강제로 DXT1으로 바꿔만 줘도 됩니다.
그럼 알파 채널이 자동으로 짤리지요.
그렇게 되면?
용량이 256kb에서 128kb로 ! 절반이 줄었습니다! (DXT5 4:4:4:8 이 DXT1 4:4:4 로 바뀌었는데 용량이 절반이 주냐고 물으신다면.. 잘 모르겠습니다… 헤더를 비롯한 기타 용량이라고 짐작할 수 밖에요…)
그리고 이것은 모바일에서도 마찬가지입니다. 애석하게도 모바일에서는 용량차는 없겠지만, 칼라의 깊이가 떨어지는 결과물이 나오겠지요. 이건 다음 시간에.
또 하나의 예를 보여드리겠습니다.
build_farm_03_mobile 파일은 농가의 집 텍스쳐 같군요.
척 봐도 알파가 필요 없을 것 같은 파일에, DXT5가 적용되어 있습니다.
용량은 1024*512 에 0.5M

알파 채널은 …?
네네. 이건 맥스에서 Unwrap 작업할때 쓰던 데이터로군요. 알파 채널에다가 이 참고 데이터를 넣어두신 후, 잊어버리시고 그냥 저장한 듯 합니다. 하지만 이것도 고스란히 용량으로 잡힌단 말이죠.
이것도 DXT1으로 바꾸어서 알파를 날려 보았습니다. 결과는?
역시 텍스쳐 사이즈가 절반으로 줄었습니다. 즉 1024*512 라는 거대한 텍스쳐를 한 장 더 쓸 수 있는 메모리가 늘었다는 말이죠!!
알파로 낭비하는 텍스쳐의 사이즈만 정리해줘도 큰 일이 됩니다. 이런게 쌓이면 바로 큰 낭비가 되는 것이지요!
아주 꼼꼼하고 깔끔하게 정리해 주셔야만 합니다.
2부는 모바일에서의 얘기입니다. 좀있다가 모바일 게시판에 적지요.