Unity Texture Compresion Format이란?

Player Setting을 보다보면

Texture Compresion Format을 본적이 있을 것이다

ETC, ETC2, ASTC 3개의 종류가 존재한다

 

Texture Compresion 즉, 텍스처를 압축하는 것인데 왜 압축을 해야만 하는걸까?

그 이유는, 게임에 Image을 Import해서 그냥 그대로 사용할 경우 용량을 많이 차지하므로 텍스처 압축을 통해 이미지 용량을 줄여줘야만 하는 것이다

 

게임에서 jpg, png로 저장되어 있는 텍스처를 원본의 이미지로 만든 뒤 "스처 블록 압축 알고리즘"을 통해 다시 저장한다. 텍스처 블록 알고리즘에 의해 저장된 텍스처는 게임이 실행 될 때 GPU에서 빠르게 압축을 풀고 GPU 메모리에 올리게 된다

 

텍스처 블록 압축 알고리즘은 소프트웨어에서 압축된 텍스처를 푸는 방식 ( 프로그래머가 별도의 API를 사용하거나, 추가 개발이 필요하지 않다. ) 이 아닌, GPU 하드웨어에서 텍스처의 압축을 풀어서 사용하기 때문에 성능이 좋다. 대신 GPU 제조사에 의해 제공되는 텍스처 블록 압축 해제 방식이 다르기 떄문에 압축 방법도 여러가지가 존재한다. 대표적으로 iOS PVRTC 방식을 제공했고, AndroidETC 방식을 제공했었다. 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://ozlael.tistory.com/84

https://docs.unity3d.com/kr/2021.2/Manual/class-TextureImporterOverride.html

 

 

강력추천

https://mentum.tistory.com/583