본문 바로가기
카테고리 없음

ETC2 파일 포맷을 실무에서 사용할 수 있는가? 1부

by 대마왕J 2015. 7. 24.

서론

 

 

ETC는 에릭슨사에서 만든 모바일용 텍스쳐 파일 포맷입니다. 지금은 안드로이드의 표준 포맷이 되었지요

기본적인 원리는 칼라 채널과 밝기 채널을 따로 연산해서 만들어 주는 방식입니다.

 

http://www.slideshare.net/kyruie/texture-compression

 

 

그리고 ETC2 파일 포맷은 유니티 5에서 포함된 파일 포맷입니다. (정확하진 않지만 거의 5 출시때와 비슷한 시기였다는건 확실합니다)

사실 ETC2 기술은 예전에 발표되었습니다만 유니티에서는 적용되지 않고 있었을 뿐이었지요.

 

 

그리고 유니티 5에 들어갔을때, 테스트 해 보니 생각보다 퀄리티도 좋고 용량차이도 전혀 없어서 ...

'이게 뭐야!' 라는 마음에 유니티 본사에 문의했습니다만, 아는 사람이 아무도 없음 ... -_-;;;

구글링을 해봐도 그때에는 자료가 많지 않았던 데다가 ,

그때 구할 수 있는 정보로는

'반드시 OpenGL ES 3.0을 지원해야만 돌아간다!!!' 

'아직 지원하는 기기가 별로 없다!!'

' 닥치고 안드로이드는 ETC1'

 라는 내용이 가득 나와서

'아직 불안하거나 호환성이 약한 건 과감히 무시하는게 낫다!' 라는 결정을 하고 일단 나중에 테스트 해 보기로 결정했었습니다.

 

 

참고한 문서

http://egloos.zum.com/cagetu/v/5830352

"안드로이드용 텍스쳐 압축은 ETC1이 낫습니다"

https://sunhyeon.wordpress.com/2015/02/05/1724/

 

 

 

 

 

 

 

 

이론 조사

 

일단 ETC2의 퀄리티와 함께 호환성등을 나타내주는 문서를 본격적으로 조사하였습니다.

https://en.wikipedia.org/wiki/Ericsson_Texture_Compression

The 'ETC2' scheme expands ETC1 in a backwards-compatible way to provide higher quality RGB compression[6] as well as compression of RGBA data (RGB plus alpha).

The following ETC2 codecs are mandatory in OpenGL ES 3.0[7] and OpenGL 4.3:[8]

  • GL_COMPRESSED_RGB8_ETC2 — Compresses RGB888 data, the followup of ETC1.
  • GL_COMPRESSED_RGBA8_ETC2_EAC — Compresses RGBA8888 data with full alpha support.
  • GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 — Compresses RGBA data where pixels are either fully transparent or fully opaque.

여기서 보면, ETC2는 ETC1의 하위 호환성을 가진다! 라고 되어 있습니다.

게다가 ETC2는 ETC1과 달리, 풀 알파 서포트가 가능한 텍스쳐 포맷과 펀치스루(?) 알파를 지원한다고 합니다. 아마도 이것은 퀄리티 조절이 가능한 것을 의미하는게 아닌가 싶긴 한데.. 하여간요.

중요한건 '하위 호환성' 이란 말의 의미가 무엇인가 란 말입니다.

 

그래서 에릭슨의 문서를 다시 확인

https://www.khronos.org/assets/uploads/developers/library/2012-siggraph-opengl-es-bof/Ericsson-ETC2-SIGGRAPH_Aug12.pdf

 

Backwards compatible (CONT.)
› ETC1 and ETC2 textures share a lot of blocks
› It is possible to store an ETC1 textures (for legacy devices) and ETC2 textures
(for OpenGL ES 3.0 devices) in a single file.
여기서 중간에 놀라운 얘기가 나옵니다. 무려 한 파일에 ETC1과 ETC2를 동시에 저장할 수 있다는 말

ㄷㄷㄷ 잠깐 이게 뭐지

 

 ETC2 is backward compatible with ETC1: If you have an old ETC1 texture, you
can load it as an ETC2 texture and the hardware will decode it correctly

ETC2를 넣으면 하드웨어에서 ETC1 옛날 버전 쓰더라도 하위 호환성이 유지된다

헐???? 지금까지 여러 사람들이 말하던 것과 뭔가 다릅니다.

이대로라면 ETC2는 분명 OpenGL ES3.0에서 지원하는건 맞지만, 그 하위에서도 돌아가긴 한다 라는 말이 되어 버리는 것 아닌가? 라는 놀라운 얘기가 나오게 됩니다. 헐... 아무도 그렇게 말한 적 없었는데.

 

그래서 문서 조사는 여기까지 하고, 실제 테스트를 진행하였습니다.

물론 초벌 테스트로 몇 가지 돌려 본게 있습니다만 그거까지 쓰기엔 너무 지저분하니까 요약해서 넘어가기로 하죠.

 

 

 

 

 

 

 

 

이미지 퀄리티 테스트

 

일단 첫 번째 테스트는, ETC1보다 ETC2가 어느 정도 퀄리티를 가지고 있는가 테스트입니다.

 

테스트 이미지는 아래와 같은 24bit 트루컬러 이미지로 테스트 해 보았습니다.  512*512 라서 1.0메가의 이미지입니다.

 

여기서 유니티 Automatic Compress 를 적용해 보았습니다.

이럴때는 보통 ETC1으로 만들어줍니다.

 

 

 

아래는 확대해본 이미지입니다. ETC1은 대충 아래처럼 깨집니다. 주로 밝기 차이가 크게 나는 곳에서 4픽셀 단위로 깨지곤 합니다.

 

 

 

         

 

이번에는 Advanced Mode에서 ETC2로 셋팅해 봅니다.

(일단 기본으로 선택 못하고 Advanced mode에 들어가야만 선택할 수 있는 것도 호환성 등에 대한 의심을 가지게 하기 충분했습니다. 분명 뭔가 아직 자신이 없는거야... )

 

 

 

 

ETC2로 해도 용량은 마찬가지입니다. 압축 퀄리티는 100으로 해서 최고 퀄리티로 만들어 봤습니다.

(사실 나중에 APK로 만들면 아주 살짝 용량이 증가하는 것을 확인했습니다만 몇십 kb 수준이라 무시했습니다)  

 

 

 

 

 

ETC2의 데이터입니다. 위에 있는 ETC1과 비교해 보면, 외각에 급격하게 명도가 변하는 곳은 어쩔 수 없다 하더라도 부드러운 그라디에이션의 표현이 굉장히 발전했습니다. 알파 채널 버전은 UI에 써도 될 정도...

 

 

 

 

그리고 ETC2는 알파 채널도 지원하는 포맷이 있습니다.

이걸 사용하면 일단 ETC2의 알파 없는 버전보다 용량이 2배로 늘어나지만 , 퀄리티는 훌륭해집니다.

UI에서 사용해도 충분할정도.

 

 

 

 

 

 

 

 

 

결론적으로, 용량은 같지만 퀄리티는 훌륭해진다 라고 할 수 있네요.

단, 알파채널 있는 버전은 용량이 두 배가 됩니다.

 

 

 

 

반응형

댓글