top of page
  • 작성자 사진Nobody

(UnityShader) 00 Game texture theory

최종 수정일: 2020년 8월 26일


컴퓨터에서 출력되는 모든 이미지 텍스쳐 파일은 0과 1로 이루어진 데이터, Binary Digit(Bit 비트)로 이루어져있다. 컴퓨터가 텍스쳐 데이터를 어떻게 처리하는지를 알아보려면 먼저 비트의 개념을 이해해야한다.


비트(Bit)의 정의


비트란 컴퓨터가 처리할 수 있는 데이터의 최소한의 단위로 0 꺼짐과 1 켜짐의 두가지 상태로 이루어져있다.





예시로 든 이미지는 꺼짐에 흰색, 켜짐에 검은색을 할당하여 표현되었다. 표현할 수 있는 두가지의 상태. 이것을 1비트라고 한다. 여기서 짚고 넘어가야 할 것은 0이 꼭 흰색으로 고정될 필요가 없으며 1의 경우도 마찬가지라는 점이다.




1비트에 1비트를 더한 2비트는 4가지의 색을 표현할 수 있다. 이미지와 같이 비트의 숫자 제곱만큼 비트를 조합하여 표현할 수 있는 경우의 수가 늘어나고 그 숫자만큼 표현 할 수 있는 색상이 많아진다.


2^n = n bit = 2^n개 만큼의 색을 표현 할 수 있음.


256컬러 8비트 팔레트

비트 8개가 모여서 표현할 수 있는 경우의 수. 2의 8제곱 즉 256가지의 색을 표현할 수 있다. 8비트 컬러 포맷으로 제작된 대표적인 게임으로 스타크래프트가 있다. 팔레트에 지정된 색을 바꾸면 이미지의 색도 바뀌는 것을 확인 할 수 있다.

이것을 Indexed color 방식이라고 한다. 이미지 파일에 배정된 비트 숫자 만큼 표현할 수 있는 색의 종류가 기하급수적으로 커지고 비트 단위에 따라 텍스쳐의 포맷이 결정된다.



흔히 넷상에서 움짤이라고 불리는 GIF 이미지 포맷이 8비트 팔레트를 사용하는 대표적인 이미지 포맷이다.


GIF는 미국의 통신 회사인 CompuServe에서 개발한 압축 저장 방식의 포맷으로, 온라인 상에서 빠른 이미지 전송을 목적으로 만들어졌다. 인터넷이 보편화되기 전부터 사용했기 때문에 세 가지 포맷 중 가장 오래된 역사를 지닌 GIF는 크기가 작고 그래픽 포맷으로는 유일하게 애니메이션 기능을 지원하여 특별한 플러그인 없이도 브라우저에서 바로 애니메이션을 볼 수 있게 한다.


표현할 수 있는 색이 256컬러(8비트)로 제한되어 있기 때문에 사진처럼 풍부하고 연속적인 톤을 지닌 이미지에는 적합하지 않고 단순한 도형 혹은 선이 분명하게 나타나야 하는 이미지에 적합하다. 또한 이미지의 색이 많이 필요치 않은 단순한 이미지라면 사용하는 색의 수를 256 이하로 줄여서 파일 크기를 줄일 수 있다.


RGB 채널과 인간의 눈


인간은 눈을 통해 빛을 인식하는데 망막에는 세가지 원추세포가 분포 하고있고 원추세포들의 반응 정도 데이터를 뇌에서 비교 분석해서 색을 구분한다. 세 종류의 원추세포 중 두 종류의 원추세포가 가장 민감하게 반응하는 구간이 녹색과 인접하여 있어 인간은 녹색 빛에 대한 민감도가 대단히 높다.



좌측 RGB가 가산혼합이고 우측 CMYK 감산혼합이다.


컴퓨터 하드웨어의 진보에 의하여 16비트 포맷을 사용할 수 있을 정도로 기술 발전을 하여 2^16 = 65536 개의 색을 표현할 수 있게 되었고 실제 현실의 가산혼합 원리를 그대로 사용한 '디지털 가산혼합'의 개념이 등장한다.


가산혼합은 인간의 원추세포가 색을 인식하는 원리를 그대로 가져온 것으로 Red Green Blue 세가지 채널에 0~1 사이의 값을 배정하여 색을 표현하는 방법이다.


우리가 지금 보고 있는 디스플레이 모니터를 확대하면 이런식으로 RGB 화소가 배치되어 있고 각 채널간의 밝기값 차이에 의해 우리 눈에서 인식하는 색이 결정된다.


16비트 컬러 포맷의 경우 RGB에 각각 5bit / 6bit / 5bit 만큼 값을 할당 할 수 있게 되어있다. 상술한 원추세포의 특성 때문에 인간이 녹색에 가장 민감하기 때문에 그린 채널에 더 많은 값이 배정되었다.


//감산혼합은 인쇄물 프린터에서 Cyan Magenta Yellow 세가지 잉크와 blacK 잉크의 혼합으로 색을 표현하는 방식으로 프린터가 잉크를 덧칠해서 색을 그려내지만 실제 출력물에서는 CMY를 더하면 진짜 검은색이 아닌 진한 갈색이 나오기 때문에 black 잉크의 추가가 따로 필요한 것이다.


24비트 / 32비트 컬러 포맷



컴퓨터 하드웨어의 발전에 의해 16비트에서 8비트가 추가된 24비트 컬러 포맷을 사용하게 된다. 24비트부터는 우리도 게임에서 자주 접하고 사용하고 있는 이미지 포맷들이다. RGB는 각 채널당 8비트씩 할당 받아 0~255 사이의 값을 가지게 되고 256의 세제곱인 16,777,216개의 색을 표현할 수 있게 된다.



24비트를 사용하는 이미지 포맷중 가장 대표적으로 JPG 이미지 포맷이 있다. 세상에서 가장 널리 쓰이는 이미지 포맷이다. 24비트 컬러까지 표현할 수 있어 연속적인 색 변화가 필요한 사진 이미지에 많이 쓰인다. 대표적인 특징은 뛰어난 압축률인데 이미지를 저장할 때 사용자가 압축률을 직접 조절할 수 있어 원하는 만큼 압축시킬 수 있지만 위 이미지 처럼 압축률에 따른 JPG 이미지 열화가 일어난다. JPG는 손실 압축을 사용하기 때문에 게임 텍스쳐 리소스로 사용되지 않는다. 엔진에서 사용하기위한 자체 압축을 한 번 더 하기 때문.


여기서 손실 압축이란 이미지에서 비슷한 색을 지닌 부분을 묶어서 색의 수를 줄이는 것을 말하는데, 압축률이 적당할 때는 눈에 잘 띄지 않지만 높아질수록 색을 묶는 영역이 점점 커져서 눈에 띌 정도로 이미지의 품질이 떨어진다. 특히 JPG로 저장한 이미지를 확대해 보면 이러한 현상을 쉽게 확인할 수 있다. 그러므로 압축률을 여러 가지로 실험해 보면서 이미지 손실을 최소화하고 용량을 줄이는 과정이 필요하다.



PNG는 GIF와 JPG의 장점을 합친 것이라고 할 만큼 성능이 뛰어나다. 우선 GIF처럼 8비트(PNG-8)로도, JPG처럼 24비트(PNG-24)로도 저장할 수 있어 다양한 이미지에 쓰일 수 있다. 압축률이 JPG만큼 뛰어나지는 못하지만, 압축한 후 이미지의 품질이 떨어지지 않는 비손실 압축을 사용해서 높은 품질의 이미지를 저장하기에 적합하다. 이미지의 일정 부분을 투명하게 만들면서 24비트 컬러의 이미지에도 적용할 수 있어 비교적 제약 없는 표현을 할 수 있다.


여기서 24비트 RGB에 8비트를 추가하여 RGBA(Alpha) 알파라는 새로운 채널을 할당하는데 이것이 바로 Truevision TGA(Targa) 이미지 포맷이다. 3D 그래픽 분야에서 가장 많이 쓰이는 표준 이미지 확장자로 알파 채널 8비트는 이미지의 투명도를 정의하는데 쓰인다. 물론 알파 채널 없이 24비트 만으로 저장하는 것 역시 가능하다.


32비트 이상의 컬러 포맷



RGB 채널당 8비트를 초과해서 사용하는 포맷 역시 존재한다. 채널당 16비트 이상을 사용하는 RAW, 채널당 32비트를 사용하는 TIFF, OpenEXR 포맷이 대표적이며 이정도 규모가 되면 영화 수준 프로젝트에도 쓰인다.


게임에서는 구동하는 디바이스마다 다르겠지만 제한적인 용도로 사용된다. Displacement 와 Height 같은 정밀한 높이 정보, 오브젝트에 빛을 미리 구워둔 라이트맵, 스카이박스에 쓰이는 HDR 이미지 등의 매우 풍부한 색감을 내야 하거나 아주 정밀한 데이터 텍스쳐에 사용한다.


게임 엔진에서 사용하는 이미지 포맷


DDS(Direct Draw Surface) 포맷은 지포스 그래픽 카드 시리즈로 유명한 nVidia사 에서 개발하였고 다이렉트엑스(DirectX) 기반의 텍스쳐를 지원할 수 있다.


과거 IBM시절에는 각각 그래픽카드마다 지원하는 포맷 방식이 달라서 소프트웨어에서 지원하는 포맷 방식과 하드웨어에서 지원하는 포맷 방식이 일치 하지 않으면 구동 할 수 없는 문제가 있었다.


하지만 Windows가 등장하면서 Windows에서 동작하는 그래픽라이브러리인 DirectX라는 규격이 등장하여 DirectX에서 지원하는 포맷 방식으로 소프트웨어를 제작하면 DirectX 칩셋을 가진 모든 그래픽카드에서 동작이 가능 하게 되었다.


그래서 DirectX에서 지원하는 압축 포맷 방식을 DDS라고 하며 세부적으로는 DXT1~DXT5가 존재한다.


DirectX11 버전부터 DDS의 최신버전인 BC(Block Compression) 포맷을 사용하여 다른 형식의 이미지에 비해 손실 대비 압축률이 높고, DirectX와 완벽하게 호환되기 때문에 대부분의 게임에서 사용된다.


위에서 서술한 블록 압축이란 4*4 픽셀 단위를 하나의 블록으로 나누어 각각의 블록마다 따로 압축하는 방식이다.


그래서 2의 제곱 사이즈만 지원한다. 가로 세로 비율은 상관없다. 예를들어 512*512 같은 정사각형, 256*1024 같은 직사각형 이미지라도 지원 가능하다.


모바일 환경에서 사용하는 이미지 포맷


모바일은 휴대성을 위해 기기의 크기 한계가 명확하기 때문에 내부 설계 역시 집약적으로 변화되었다. PC에서 CPU와 GPU의 등의 수많은 프로세서들의 기능을 하나로 합친 SOC(System of Chip, 단일 칩 체제) 혹은 AP(Application Processor)칩을 제조사 마다 따로 개발하였다.


(자료 사진은 삼성 스마트폰 'Galaxy' 시리즈의 대표 AP 엑시노스)


퀼컴 '스냅드래곤' / 애플 'A' / 엔비디아 '테그라' / 샤오미 'S1' / 화웨이 '기린' 등등 수많은 제조사들과 독자 규격이 난립하고 지원하는 이미지 포맷도 다르니 모바일 개발자들 입장에서는 당연히 모든 AP에서 동작하는 이미지 포맷을 요구하게 되었다.


그래서 안드로이드 계열(사실상 IOS만 제외)을 전부 지원하는 ETC 이미지 포맷이 등장한다.


하지만 ETC1은 알파 채널을 지원하지 못하고 ETC2는 OpenGL 3.0 이상 에서만 동작했다.


나중에는 안드로이드와 iOS 둘다 지원하는 ASTC 이미지 포맷이 나왔는데 OpenGL 3.2 이상에서만 동작하여 엑시노스 6세대 미만 AP는 지원 불가로 엄청나게 문턱이 높다.


이처럼 대부분의 모바일 유저들이 ASTC가 지원 안 되는 구형 AP가 탑재된 모바일 기기를 사용한다는 점이 문제다. 개발자들이 모바일 게임 시장 상황 뿐만 아니라 지역별 유저 최소사양까지 고려해서 개발 해야 된다는 점을 시사하는 것이다.



안드로이드 OS 압축 포맷


DXT : Nvidia Tegra 칩

PVRTC : PowerVR 칩 : 가로 세로가 동일한 2의 승수 크기의 텍스처만 가능

ATC : SnapDragon 칩


ETC1 : 안드로이드 전 기기 : RGB채널만 지원이 되고 A채널 포함된 텍스처는 지원안됨

ETC2 : 안드로이드 전 기기 : OpenGL ES 3.0 이상에서만 지원 가능


ASTC : 안드로이드/iOS 전부 지원가능 : OpenGLES 3.2 이상에서만 지원 가능


iOS(애플 전용) 압축 포맷


PVRTC : PowerVR 칩 전용 : 가로 세로가 동일한 2의 승수 크기의 텍스처만 가능




조회수 412회댓글 0개

최근 게시물

전체 보기
bottom of page