炸殺
카테고리
작성일
2020. 4. 5. 22:33
작성자
炸殺

 

세상에는 정말 다양한 파일 포멧들이 존재합니다.

 

말도 안되게 많음

 

 

보통 그림을 그리시는 분들이 많이 익숙하실 포멧으로는 PNG나 TGA, JPG가 있으실 겁니다.

이중 PNG와 TGA는 '비손실 압축 포멧'으로 게임 파일 포멧으로도 많이 쓰이고 있죠.

 

 

어린 시절 열심히 그린 그림을 JPG로 저장해놓고 왜 깨지는건지 몰라 엉엉 울었던 생각이 나네요....

 

 

우리가 아무리 비손실 압축 프로그램으로 깨끗하게 저장해도

이걸 엔진에 넣으면 엔진에서 호로록 압축해 버립니다. 만약 이미 압축된 파일을 넣는다? (OMG...)

 

PC와 모바일은 각각 압축 포멧이 다른데요, 우선 PC 먼저 알아봅시다.

 

 

 

 

 

DDS (Direct Draw Suface) 

 

(살짝 올드하긴한데)

DDS는 nVidia사에서 개발한 포맷 방식으로 Dirext X의 텍스쳐 포맷과 일대일로 대응하는 손실 압축 방식입니다.

Dirext X와 완벽하게 호환 되어 빠르게 사용이 가능하고, 파일의 용량을 1/5로 줄여주며, 압축률에 비해 파일 손실이 적어서 대부분의 게임에서 해당 포멧을 사용하고있죠.

 

게임 엔진에선 이미지를 불러올 때 파일에서 한 픽셀씩 쏙쏙 뽑아 옮기는 굉장히 비효율적인 짓을 하는데

DDS포멧을 사용하면 압축한 것을 통째로 4*4 단위(16픽셀)을 가져가 퍽하고 붙여버립니다.

거기에 이 포멧에는 Mipmap/Cubemap등 게임에서 사용하는 특수 속성들도 넣을 수 있으니 Good

 

대신 4*4 단위씩 붙여넣으니 파일의 크기는 2의 승수만 가능합니다.

지금이야 엔진에서 바로 압축해주지만 옛날옛적 포토샵에서 직접 일일히 DDS 포맷으로 저장하던 시절엔 파일 사이즈가 2의 승수가 아니면 저장도 안시켜줬다고....

 

 

그럼 어떻게 컬러가 압축 되는 걸까?

 

예를 들어 TGA파일로 저장을 했다면 색상은 R8 G8 B8의 값을 가지고 있었을 것입니다.

여기서 DDS로 압축을 하면 R5 G6 B5가 됩니다. 24bit에서 16bit가 되었네요.

 

DDS로 압축할 시 4*4에서 가장 대표적인 색 두가지를 추출, 나머지는 대표색과의 차이 정보만 저장한다.

 

때문에 게임을 할 때 텍스쳐를 자세히 들여다보면 4픽셀 씩 묘하게 깨져있는 것을 확인할 수 있습니다.

(너무 궁금해서 이거 다 쓰고 확인하러 갈거임)

색상과 디테일을 포기하고 용량을 1/5로 줄여버리는 것.

 

 

 

주로 쓰인 건 DXT1과 DXT5.

 

[ DXT1 RGB(No Alpha) : R5G6B5 ]

16bit로 알파가 없다.
DXT1 ARGB : A1R5G5B5으로도 사용했지만 알파 테스트 용도로만 쓰였던 모양.
[ DXT5 ARGB (Interpolated) : A8R5G6B5 ]

알파 채널에만 8bit가 할당이 되었는데 이는 알파의 퀼리티가 떨어지게 될 경우 느낌이 확 이상해진다.
(얼룩덜룩해짐...) 때문에 알파는 압축하지 않고 색상만 압축한 형태가 된 것.

 

이 밖에도 32bit, 256 파레트, 한 개의 채널만 있는 등 다양한 형식을 지원했다. (지금은 엔진이 다알아서 해줌~) 

 

 

BC (Block Compression)

 

DirectX11부터 BC(블록 압축)으로 진화합니다.

PC에서만 쓰이는 고오급 포맷으로 기본적으로 DDS와 형식은 같지만 더 나아가 HDR을 지원하기 시작.

 

DX10부터 BC가 나오기 시작했는데, BC1~ BC5는 DX10 (사실상 BC3까지는 기존의 DXT)

BC6H~BC7은 DX11과 대응합니다.

 

BC1은 기존의 DXT1, BC3는 기존의 DXT5와 같다고 보시면 됩니다.

 

 

[ BC1 ]

R5 G6 B5 (RGB)에 0 또는 1bit의 알파 포함으로 기존 DXT1의 대체.
[ BC2 ]

R5 G6 B5 A4 (RGBA) BC1에 4bit의 알파가 추가된 형태로 DTX2~3의 대안.
[ BC3 ]

R5 G6 B5 A8 (RGBA) 16bit RGB채널에 8bit 알파. DTX4~5의 대체.
[ BC4 ]

1채널 색상(8bit)을 가진 형태로 하이트 맵 등에 사용된다. ATI1N의 대체 
[ BC5 ]

2채널 색상(8bit/8bit)을 가진 형태로 노말 맵 등에 사용된다. ATI2N(30Dc)의 대체 
[ BC6H ]

R16 G16 B16. HDR 데이터에 사용.
[ BC7 ]

채널당 4~7bit를 할당. 알파 채널은 옵션으로 0~8bit를 할당할 수 있다. RGB, RGBA 이미지.

BC7은... 어디에 쓰이는 걸까...?

 

 


 

이제는 모바일 입니다. 모바일.......벌써부터 정신이 아찔합니다.....

모바일 기기는 AP(Application Process) 라고 해서 컴퓨터의 CPU와 GPU가 합쳐진 놈입니다.

 

근데 제조사나 기기마다 칩셋 다 다릅니다 그 말은 뭐냐?

지원하는 포멧도 칩셋마다 다 다르다~~~~~~~!

 

 

'Samaung Exynos 980'

 

 

갤럭시의 칩셋은 Samsung 'Exynos'

애플은 전부 Apple 'A'

요즘 핫한 스위치의 칩셋은 Nvidia 'Tegra' 입니다.

 

그나마 스위치의 칩셋을 만든 Nivdia는 원래 PC 그래픽 카드를 만드는 회사다보니 DXT포멧이 호환이 됩니다.

PC게임들이 우수수 스위치로도 출시한 이유를 이제 알겠네요. 

 

 

대표적인 모바일 AP로는

 

[ PowerVR 계열 ]
- PVRTC : 주로 애플 폰에서 사용되며 가끔 안드로이드도 존재.
  정사각형 텍스쳐만 지원, 구형 애플기기에서도 사용함. (더러워서 정사각형으로 만듬)
[ 퀄컴 Snapdragon ]
- ATC파일 포맷
[ Nvidia Tegra ]
- DXT파일 포맷. PC랑 똑같다!

 

 

이렇게 중구난방하니..... 안드로이드는 통합 포멧을 만들어버렸습니다. 그 이름은 바로....

 

 

 

ETC

 

[ETC 계열]

안드로이드 전 칩에서 사용 가능하다.
대신 RGBA가 없다. 즉 알파가 없다는 것. 알파를 쓰려면 무압축 포맷을 사용해야한다는 뜻이다. (아!!!)
[ECT2 계열]

안드로이드 기기 모든 칩에서 사용이 가능하지만 OpenGL ES3.0 이상에서만 지원한다. 
[ASTC 계열]

안드로이드 기기 모든 칩은 물론 >>>IOS 모든 칩<<<에서 사용이 가능하다!
또한 압축되는 픽셀의 블록 크기를 가변적으로 선택이 가능해졌다.
OpenGL ES3.2 이상에서만 지원한다.

 

 

◈ 여기서 OpenGL이란?

 

오픈 그래픽 라이브러리(Open Graphics Library)로 1992년 실리콘 그래픽스사에서 만든 2차원 및 3차원 그래픽스 표준 API 규격으로, 프로그래밍, 플랫폼 간의 교차 응용 프로그래밍을 지원합니다.

 

OpenGL은 Vertices를 Pixels로 변환시켜주는 것.

 

 

 

OpenGL ES3.0은 iOS 7.0부터, 안드로이드는 4.3버전 (jellybean mr2)부터 지원하고 있으며,

OpenGL ES3.2는 2015년 8월에 발표되었습니다.

 

 

앵? 2015년? 그럼 걍 ASTC계열로 쓰면 되는 거 아냐? 라고 생각할 수 있지만.... 해외엔 아직도 저사양 휴대폰을 쓰는 나라가 많습니다. 우리 게임이 저사양게임이다...하면 ECT 계열을 쓰는 것도 고려하지 않을 수 없는 부분인 것이죠 (영업부와 멱살 대결)

슬슬 ASTC로 넘어가는 추세이긴 하나 아직까지 ECT나 ECT2계열을 완전히 버릴 수는... 없는 상황인 것 같습니다. 돈은 벌어야하니까...

 

 

 

(OpenGL관련 항목은 추후 업데이트 예정)

'Graphic' 카테고리의 다른 글

01. 컴퓨터와 색상 (bit)  (0) 2020.04.05