[유니티 TIPS] 알쓸유잡 | 효율적인 텍스처 압축 이해하기& 꿀팁
💡 Texture Format
🐤 텍스쳐 압축이 필요한 이유
- 일반적으로 우리가 생각하는 이미지는 32 bit True Color(채널 당 8 bit)
→ bpp(bit per pixel)라고 표현
- 32 bit를 그대로 저장하지 않음 → 압축!
- PNG는 비손실 압축
→ 이미지에 들어있는 색상 숫자에 따라 용량 차이가 심함
→ 유사한 색상이 많을 경우 PNG는 압축 효율이 좋기 때문에 동일한 품질이라면 JPG보다 퀄리티가 좋을 수 있음
- JPG는 손실 압축
- PNG나 JPG 이미지를 그대로 GPU에서 사용하게 되면 큰 용량을 차지
- PNG나 JPG는 디스크에 저장된 용량을 아끼기 위한 것이지, 메모리 효율을 위해 제작된 알고리즘은 아님
→ GPU에서 사용하는 전용 포맷으로 사용
- 이미지를 GPU에서 렌더링할 때 사용 ⇒ Texture
- 조건
- 빠른 디코딩
- 랜덤 액세스
- 순차적으로 접근하는 것이 아닌 특정 지점에 접근해서 바로 값을 얻어야 함
- 인코딩 상태로 메모리에 존재
- GPU가 압축된 상태에서 랜덤하게 접근해서 데이터를 얻음
- 사이즈 절약(메모리, 저장 장치)
🐔 가변 비율 압축 vs 고정 비율 압축
- 가변 비율 압축 : PNG, JPG
- 이미지가 복잡하면 압축 효율이 떨어지고, 단순하면 압축 효율이 높아짐
- 이미지는 기본적으로 가변 비율 압축 방식
- Ex : RLE (Run-Length Encoding, 실행 길이 인코딩)
- 고정 비율 압축 : 우리가 사용하는 Texture
🦜 DXT
- DirectX에서 사용하는 대표적인 Texture 포맷
- 블록 기반 압축 사용 (BC, S3TC)
- 대부분의 Texture는 블럭 기반 압축
- 4 * 4 블럭으로 나누어서 블럭 단위로 압축
- 랜덤 액세스할 때는 해당 블럭으로 찾아가 블럭의 압축을 풀어서 접근
- DXT 1 방식은 64 bit 사용
- 한 픽셀 표현을 위해 4 bit 사용 (64 bit / (4 * 4))
🦆 PVRTC
- 주로 애플에서 사용
- 옛날에 사용하던 방식임
- DXT와 흡사한 방식
- 컬러 key 2개를 뽑음
- 4 * 4 pixel 단위로 key를 뽑음
- 2개의 대표 이미지 색상은 가로, 세로 1/4 사이즈로 생성
- DXT에서 나아가 이미지를 블러링 함
- DXT는 블럭 기반이므로 확대하면 블록 모양이 티가 남
- 블러링으로 인한 침범 문제가 있음
🦢 ETC
- 주로 안드로이드에서 사용
- 사람의 눈은 밝기 변화에는 민감하고 채도 변화에는 둔감
→ 색상은 저해상도로, 밝기는 고해상도로 저장해서 조합
- ETC 1(4bpp)과 ETC 2(4, 8bpp)
- 크런치 (Crunch)
- 메모리 절약보다는 디스크 용량을 아끼기 위한 것
- ETC 포맷을 디스크에 저장할 때 한 번 더 압축
- 메모리에 올릴 때 압축을 풀어서 올림
- 로딩할 때 좀 더 걸릴 수 있음
🦉 ASTC
- 통일된 텍스쳐 포맷
- Addaptive, Scaler
- 유연하고 확장성 있는 텍스쳐 포맷
→ 블록 사이즈 지정 가능
- 알베도 텍스쳐나 모델링에 쓰이는 텍스쳐는 4 * 4로 높은 품질 사용
- 파티클이나 이펙트는 12 * 12를 사용
- 텍스쳐별로 유연하게 선택
- PVRTC는 색이 번지는 현상이, ETC는 의도하지 않은 컬러가 나타나는 현상이 있음
→ ASTC를 사용하면 원본과 매우 흡사한 품질로 사용 가능
- 대표 컬러를 뽑아서 블렌딩하는 방식
- 블록마다 모드가 다름 (최대 8가지)
- key 컬러 안에서도 그라데이션이 들어감
- 최대 4개까지 key 컬러를 뽑을 수 있음
- 1:1 해상도로 저장하는 것이 아닌 알고리즘에 의해 패턴을 만들어냄
- 주로 모바일에서 사용
🦩 BC7
- ASTC와 매우 유사한 접근 방식
- ASTC는 가변 크기 블록을 갖지만, BC7은 고정 크기 블록을 가짐
- 주로 PC, 콘솔에서 사용
- ASTC와 거의 동일한 품질
끗~,,