Player Setting을 보다보면
Texture Compresion Format을 본적이 있을 것이다
ETC, ETC2, ASTC 3개의 종류가 존재한다
Texture Compresion 즉, 텍스처를 압축하는 것인데 왜 압축을 해야만 하는걸까?
그 이유는, 게임에 Image을 Import해서 그냥 그대로 사용할 경우 용량을 많이 차지하므로 텍스처 압축을 통해 이미지 용량을 줄여줘야만 하는 것이다
게임에서 jpg, png로 저장되어 있는 텍스처를 원본의 이미지로 만든 뒤 "텍스처 블록 압축 알고리즘"을 통해 다시 저장한다. 텍스처 블록 알고리즘에 의해 저장된 텍스처는 게임이 실행 될 때 GPU에서 빠르게 압축을 풀고 GPU 메모리에 올리게 된다
텍스처 블록 압축 알고리즘은 소프트웨어에서 압축된 텍스처를 푸는 방식 ( 프로그래머가 별도의 API를 사용하거나, 추가 개발이 필요하지 않다. ) 이 아닌, GPU 하드웨어에서 텍스처의 압축을 풀어서 사용하기 때문에 성능이 좋다. 대신 GPU 제조사에 의해 제공되는 텍스처 블록 압축 해제 방식이 다르기 떄문에 압축 방법도 여러가지가 존재한다. 대표적으로 iOS 는 PVRTC 방식을 제공했고, Android는 ETC 방식을 제공했었다. 2012년에 공동 개발을 통해 iOS, Android에서 공통적으로 사용할 수 있는 ASTC가 나왔지만, OpenGL 3.2 이상부터 지원하는 단점이 존재한다.
또한, ETC와 PVRTC는 압축되는 블럭의 크기가 4x4로 고정되어 있는 반면, ASTC는 압축되는 기준 블럭의 크기를 4x4에서 12x12 블럭으로 다양하게 선택을 할 수 있다
그렇다면 OpenGL es3.0이상은 어떻게 체크하지? 위에 사진에 보면 3.0이 끝인데?
바로 Require ES 3.1~ 3.2를 체크해주면 된다!
그러면 Unity에서 알아서 런타임 시 가장 최근 버전의 Open GLES버전을 사용하게 될 것이다!
정리해보면
- ETC, ETC2, ASTC는 Android에서 사용되는 텍스처 블록 압축 알고리즘이라고 생각하면 되며, ASTC가 가장 가성비가 좋고 활용도가 좋다
- LDR RGB와 RGBA 텍스처의 경우 OpenGL ES 3.1(어디서는 3.0이상부터 포함이라는데...자세히 알아봐야 할 듯) 또는 Vulkan을 지원하는 대부분의 현대 Android GPU는 ASTC 압축 포맷도 지원한다
- 구형 기기에 대한 지원이 필요하거나 크런치 압축을 추가하려는 경우 Vulkan 또는 OpenGL ES 3.0을 운영하는 모든 GPU는 ETC2 포맷을 지원한다
- 그 이전의 기기에 대해서는 일반적으로 ETC 포맷만 사용 가능하다
- 단점은 직접적인 알파 채널 지원이 없다는 점이다
참고자료
https://everyday-devup.tistory.com/89
https://docs.unity3d.com/kr/2021.2/Manual/class-TextureImporterOverride.html
강력추천