게임용 텍스처 포맷의 이론



이 글은 컴퓨터가 색을 표현하는 방법과 텍스처를 형성하는 Bit의 개념을 통해 게임에 어떤 방식으로 텍스처가 출력이 되는지 내용을 작성한다.





1. Bit의 개념과 컴퓨터가 화면을 출력하는 원리


Windows7 32bit,  8bit Color 등 컴퓨터를 사용하다 보면 Bit라는 단어를 많이 접한다.

컴퓨터의 동작은 전부 0과 1로 이루어진 명령어로 동작한다.

Bit란 한 마디로 0이나 1값이 저장되는 공간이다.



위 사진은 1bit로 2가지 색만 표현이 가능한 화면이다.  0 = 출력 안함, 1 = 출력 함

가장 핵심 원리는 1bit란 어떤 색인가를 표현하는게 아닌 표현할 수 있는 경우의 수를 뜻한다.



다른 예시로 위 사진은 8bit 컬러로 제작된 스타크래프트이다. 8bit 컬러 팔레트를 사용하며 이 게임에 사용될 수 있는 

컬러는 2^8 값인 256개 이다. 

이전에 말한 256개의 컬러는 어떤 색인가를 표현하는게 아닌 표현할 수 있는 경우의 수의 예시로




우측에 팔레트에서 파란색 컬러를 빨강색으로 바꾸면 그대로 스타크래프트 이미지에서 해당 팔레트 부분의 색을 사용한 

미네랄 쪽의 색이그대로 변경되는 것을 확인 할 수 있다.




결론적으로 컴퓨터가 화면에 색을 표현하는 방식은 지원하는 bit값에 따른 가질 수 있는 경우의 수를 칼라로 표현하는 것이다.



2. 적은 Bit수로 색을 표현하는 방법



과거 4Bit ~ 8Bit의 적은 수의 컬러를 활용할때 팔레트 개념을 사용한 Indexed Color라고 불린다. 이 적은 숫자의 컬러로 풍부해 보이는 그래픽 표현을 하는 기술 중 하나가 디더링(Dithering) 이라고 불린다


디더링(Dithering)이란? : 제한된 색을 이용하여 음영이나 색을 나타내는 것


4bit 컬러에서 디더링으로 표현한 그래픽표현의 예시


3. RGB 컬러

16bit 시절 부터 65536개의 색으로 매우 많아 지면서 RGB(가산혼합)이라는 개념이 등장한다.

RGB개념으로 R : 5Bit, G : 6Bit, B : 5Bit로 각 채널당 표현할 수 있는 색상의 갯수를 혼합하여 하나의 색을 구현한다.

(이중에서 G가 6Bit로 높은 이유는 32~64 단계의 색상으로 사람의 눈을 충족하기 어려운 컬러 숫자내에서 인간이 가장 민감하게 반응하는 색인

초록색 채널을 더 많은 단계의 색을 표현하여 자연스럽게 보이도록 하기 위해서이다.)


이후 24bit컬러의 등장으로 한 채널당 8bit로 256가지 색을 표현할 수 있으며

256 * 256 * 256 총 16,777,216가지의 매우 많은 색을 표현 가능하게 되어 현재 시점에 기본으로 사용되는 bit이다.



포토샵에서 기본으로 세팅되어 있는 bit가 24bit이며 포토샵에서의 흰색이 255, 255, 255값인 이유는 각 채널당 8Bit로 256가지 색을 표현하므로 

0을 포함해서 RGB가 255일때 흰색이 되는 것이다.


이후 추가로 R8G8B8에서 A채널이 추가된 32bit 가 존재하고 

32bit를 넘어선 엄청난 수의 색을 표현 할 수 있는 64bit 이미지일 경우 HDR, RAW이미지가 존재 한다.



4. 게임에서 텍스처를 사용하는 과정



텍스처 포맷 방식은 크게 비손실 포맷, 손실 압축 포맷으로 2가지가 존재한다.

여러가지 데이터를 고속으로 처리해야하는 게임 특성상 텍스처를 압축하여 운용하는것은 필수이다.

그리고 텍스처는 일반 디퓨즈 텍스처, 노멀맵텍스처, 알파맵 텍스처 등 여러 용도가 있다.


상황에 맞게 어떠한 압축 포맷을 사용할 것인지 비손실 포맷을 사용 할 것인지

어떤 채널만 사용할 것인지를 판단하여 가장 최적화 되고 알맞은 포맷을 선택하는게 게임 최적화의 가장 기본이 될 것이다.


압축 포맷은 여러가지 방식의 포맷 방식이 존재하며 특히 PC, Android, iOS등 각 플랫폼 별로 그래픽카드에서 지원하는 

압축 방식이 각각 존재한다.


 - PC(Windows)에서의 압축 포맷 - DDS

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

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

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


과거에는 제작한 텍스처를 위 프로그램을 통하여 DDS 포맷으로 변환하여 게임엔진에 넣어서 사용을 했다.



최근에는 유니티나 언리얼같은 상용 엔진에는 텍스처를 넣으면 자동으로 변환해 주게 되었다.

위는 유니티의 캡처 사진이며 사진 하단에 DXT1 포맷으로 변환된것을 확인 할 수 있다.



 - PC(Windows)에서의 압축 포맷2 - BC

DDS에서 발전한 최신 포맷이며 DirectX11부터 지원이 되는 포맷이다.



 - Android에서의 압축 포맷

안드로이드는 다수의 제조사가 존재하여 각 그래픽칩셋 제조사마다 각각의 다른 포맷을 지원한다.

DXT : Nvidia Tegra 칩 전용

PVRTC : PowerVR 칩 전용

   -! : 가로 세로가 동일한 2의 승수 크기의 텍스처만 가능

ATC : SnapDragon 칩 전용


ETC1 : 안드로이드 전 기기 지원 가능 

            -! : RGB채널만 지원이 되고 A채널 포함된 텍스처는 지원안됨

ETC2 : 안드로이드 전 기기 지원 가능

            -! : OpenGLES 3.0 이상에서만 지원 가능


ASTC : 안드로이드/iOS 전부 지원가능

            -! : OpenGLES 3.2 이상에서만 지원 가능


위 자료와 같이 다수의 제조사가 각자 다른 포맷 방식을 지원하고 ETC1,2, ASTC와 같은 모든 기기에서 지원하는 

특성을 가진 포맷형식은 조건 사항이 걸려있다.



- iOS에서의 압축 포맷


PVRTC : PowerVR 칩 전용

   -! : 가로 세로가 동일한 2의 승수 크기의 텍스처만 가능


ASTC : 안드로이드/iOS 전부 지원가능

            -! : OpenGLES 3.2 이상에서만 지원 가능



Shader란?

파이프라인에서 주요 부분을 쉬운 문법으로 뽑아서 그래픽디자이너가 사용할수 있게 만든게 쉐이더


Float : C/C++에서 소수점이 붙어있는 실수를 처리하기 위해 사용한다. 쉐이더 언어에서는 float3, float4등 데이터 표현에 사용한다.


흰색 : float3 (1,1,1)

빨강 : float3 (1,0,0)

알파있는 빨강 : float4(1,0,0,1)

투명한 노랑 : float4 (1,1,0,0)


Shader : 질감만드는게 쉐이더의 근본, 빛계산라이팅계산이 쉐이더의 전부

HLSL : 다이렉트X에서 나온 쉐이더언어

GLSL : OpenGL에서 나온 쉐이더 언어

CG : Nvidia에서 나온 쉐이더 언어 









WRITTEN BY
CatDarkGame
Technical Artist dhwlgn12@gmail.com

,