프로그래밍 언어 입문서가 아닌 프로그래밍 기초 개념 입문서
문과생, 비전공자를 위한 프로그래밍 입문책입니다.
jobGuid 꽃미남 프로그래머 "Pope Kim"님의 이론이나 수학에 치우치지 않고 실무에 곧바로 쓸 수 있는 실용적인 셰이더 프로그래밍 입문서 #겁나친절 jobGuid "1판의내용"에 "새로바뀐북미게임업계분위기"와 "비자관련정보", "1판을 기반으로 북미취업에 성공하신 분들의 생생한 경험담"을 담았습니다.
Posted by 대마왕J

비밀..이라지만 그렇게 거창하진 않습니다 허허허

그냥 뭐 조금 정리할 필요가 있어서 쓴 것 뿐이지요.

 

일단 유니티에는 여러 가지 텍스쳐 포맷이 있고, 그것들은 대부분 자동으로 선택이 되곤 합니다.

 

 

물론 Advanced로 하게 되면 이렇게 세부적으로 설정이 가능하지만, 이렇게까지 하실 분들은 별로 없겠죠.

게다가 이걸 하나 하나 다 설명하고, 유니티에서 사용되는 자동포맷이랑 연결해서 설명하려면 책으로 한 20페이지는 넘을겁니다 (...)

 

그러므로 여기서는 요약해서!

안드로이드!

에서만!

자동으로!!

 

사용하는 포맷에 한정해서 얘기하죠.

아참! ETC2는 빼겠습니다. 자동으로 설정되지도 않고, 아직 범용으로 사용되는 포맷도 아니라서요.

 

일단 기본적인 것. 다 아시겠지만 ...

유니티 엔진에는 어떤 텍스쳐라도 넣을 수 있습니다.

TGA를 넣어도 되고, jpg를 넣어도 되고, 심지어는 PSD를 넣어도 됩니다!!

전에 어떤 커뮤니티에서, 유니티에는 PNG를 넣는게 가장 가벼우니까 그렇게 넣자라는 글을 본 적도 있는데... -_-

 

결론부터 얘기하면, 그런건 하등 상관이 없습니다! 무조건 가장 품질 좋은 녀석을 넣으세요! 용량이 커도 됩니다!!

사이즈부터 포맷까지 모두 유니티 내부에서 다시 관리하기 때문에, 밖에서 만든 파일 포맷은 아무 상관이 없습니다. 오히려 밖에서 특정 포맷으로 압축해서 들어온 파일은 유니티 내부에서 '다시' 압축하기 때문에 이론적으로 더 깨질 가능성이 큽니다. [각주:1]

유니티건 언리얼이건 게임에서 쓰이는 파일 포맷은 거의 다 '손실압축' 파일 포맷이기 때문이지요[각주:2]

 

자 각설하고, 그럼 안드로이드에서 사용할 수 있는 파일 포맷에 대해 알아 보겠습니다.

 

 

=====================================================================

 

따란 - 3 가지 경우의 수가 있습니다.

이 경우의 수로 작성하면, 모든 기기에서 잘 돌아가는 파일 포맷이 됩니다. (물론 프로젝트가 안드로이드 상태여야 합니다)

고급 기능으로 바꾸면 다른 경우의 수도 많이 있지만, 그렇게 기계에 안맞는 포맷을 사용하면 안돌아가는 기기가 생기게 됩니다!

아니, 표현이 틀렸군요. 안돌아가는게 아니라요....

 

http://smilejsu.tistory.com/m/post/732

 

요거 참고하시면...

 

사용자 앱이 지원되지 않는 텍스쳐 압축(compression)을 사용하면 그 텍스쳐는 RGBA32로 무압축(uncompressed)되며 압축된 것들과 함께 메모리에 저장이 됩니다. 그래서 이 경우 텍스쳐의 압축을 푸는데 시간을 잃게되며 두번의 저장으로 인해 메모리 손실을 봅니다. 이것은 또한 렌더링 성능에도 아주 부정적인 영향을 줄 수 있습니다.

.... RGBA32 비트 무압축이라는 엄청난 결과가 나옵니다!!!! 히이이익

더 무서운 문제는, 이게 눈으로 구별할 수가 없다는 겁니다!!! 차라리 지원을 안해서 깨지면 몰라도, 아예 보이지도 않고 메모리만 처묵처묵하는 무서운 일이 일어난다는 것입니다.

그래서 우리는! 지원하는 파일 포맷을 매우 주의해서 써야 합니다!!!

 

 

그러므로 저 위 3가지 한도내에서 쓰는것이 가장 안전합니다. 다른 파일 포맷을 쓰고 싶으시더라도... 참아주셔야 합니다 ㅠㅠㅠㅠ 잘못하면 난리가 나요...

 

 

 

그럼 저 3가지 파일 포맷을 보면...

일단 저 3가지 자동 포맷도 2가지 경우로 다시 나눠집니다. 바로 '알파가 있느냐 없느냐!'

라는 걸로 말이죠

 

 

 

자 그럼 일단 이런 텍스쳐가 있습니다.

 

 

 

소개드립니다!!! 알파있슈알파없슈 형제입니다.

지금 보시면 알겠지만, 알파 있는 쪽이 0.3M 더 큽니다. 뭐 당연하지요. 알파가 있는 쪽이 좀 더 큰게 뭐 이상하지도 않죠.

 

그럼 이걸 압축(compressed) 로 해 보겠습니다.

 

1. 압축 (compressed) 알파없슈 

 

 

 

압축되고 알파 없는 이미지입니다. 512*512이므로 꽤 큰 이미지이지만, 글씨나 공의 외각에 아티펙트 (찌꺼기) 가 보이도록 압축되었습니다.

 

압축은 대충 이 정도의 느낌. 4*4 씩 압축하는 전형적인 게임 Texture 압축방법을 보여주고 있습니다.

 

크기는 170.7 KB

원본 이미지가 1M였으니 약 16.6% 의 크기가 되었습니다. 약 84%가 줄었으니  상당히 압축이 크게 되었지요!!!

 

이 방식은 안드로이드 기본 압축인 ETC1 입니다. 알파가 없을때의 기본 압축이죠.

일명 ETC1 4bit... 이 방식은 색상을 떨어뜨릴 뿐만 아니라, 색상끼리의 관계를 다시 손실 압축하여 용량을 줄입니다!

Compressed RGB texture. This is the default texture format for Android projects. ETC1 is part of OpenGL ES 2.0 and is supported by all OpenGL ES 2.0 GPUs. It does not support alpha. 4 bits per pixel (32 KB for a 256x256 texture)

 

 

 

 

2. 압축 (compressed) 알파있슈 

 

똑같은 compressed 옵션인데, 알파가 있는 녀석을 선택하면 용량이 거의 줄지 않으면서, 퀄리티도 개판이 됩니다!!

원래 1.3 M 였던게 0.7M가 되면 말 다했죠. 별로 이득이 없습니다. 절반밖에 되지 않으니까요. ETC1이 84%의 용량을 보이는 것과 비교해 보시면 차이가 확 느껴질 겁니다.

 

이 방식은 RGBA16 이라는 파일 포맷으로, 색상을 떨어뜨리지만 압축은 하지 않습니다. 사실상 압축이 아니예요!!! 

즉 원래 RGBA32 비트의 원본 포맷은 8:8:8:8 파일 포맷인데,

RGBA16 비트는 이를 그대로 색상 퀄리티만 떨어뜨려 4:4:4:4로 만들어 버리고 끝인 겁니다. 그래서 용량이 거의 절반인거죠.

바꾸면서 디더링이라도 좀 해주지.. 라는 생각도 있습니다만 하여간 해주지 않네요. 그래서 저렇게 줄무늬가 선명하게 남습니다.

 

 

 

뭐 비교할 필요도 없...

 

 

 

 

3. 16bit 알파없슈

이제 두 번째 옵션인 16비트를 보겠습니다.

일단 알파없는 녀석부터 보죠

 

 

 

 

 미세하게 줄무늬가 보입니다.

 

 

그래도 상당히 깨끗합니다!

이렇게 깨끗한 이유는.. 에또...

이것 역시 압축을 하지 않기 때문입니다.

색상만 떨어뜨려 버리지요.

 

용량을 보시면 알겠지만...

0.7MB 입니다. RGBA32bit 일때의 절반 정도죠.

알파가 없는데 왜? 라고 생각하실 수도 있겠지만, RGB 만 있을때 16bit로 바꾸면 이렇게 연산이 됩니다.

 

5:6:5

 

비트수는 확실히 RGBA16인 4:4:4:4 일때보다 각 채널당 할당 비트가 높아졌습니다만, 어쨌거나 8:8:8인 원본보다는 떨어집니다.

그리고 압축도 하지 않고요.

그래서 퀄리티는 높아졌지만 용량은 같은 상태인 겁니다.

정밀하진 않지만, 약간 퀄리티를 포기하는 한이 있어도 이녀석은 마스킹으로 사용 가능한 녀석입니다.

 

 

 

4. 16bit 알파있슈

이건.... compressed때랑 똑같습니다!!!!

어차피 compressed로 해도 알파가 있으면 RGBA16으로 바꾸기 때문에, 지금 알파 있는 녀석을 16bit로 바꿔도 똑같아집니다!!!

 

 

즉 이 녀석은 굳이 나서서 쓸 녀석은 아닙니다.

 

 

5. TrueColor 알파없슈

 

이 녀석은 TGA와 똑같은 용량에 무압축입니다! 즉 알파가 없으니 24bit이고 , 용량도 그 만큼인거지요.

최고의 퀄리티가 필요하면서 메모리를 낭비하고 싶을때 사용하는 파일 포맷입니다!!

 

퀄리티는 최강이지만 메모리 사용량은... ㅠㅠㅠ

 고품질의 UI를 사용하고 싶을 때 사용하는 포맷입니다.

 

 

 

6. TrueColor 알파있슈

 

역시 TGA와 똑같은 용량에 무압축입니다! 알파가 있고 32bit인 초 고품질 파일 포맷입니다.

 

 

 

 

 

 

정리하기

 

정리하자면, 안드로이드에서 사용할만한 파일 포맷은 다음과 같습니다.

 

1. 알파 없을때 (원본 1MB)

 

compressed : 압축 효과 가성비 최고, 170.7kb 가급적 이거 사용하길 원합니다.

 

16bit : 압축하지 않습니다. 약간 색상이 깎일 분입니다. 0.7MB . 용량이 너무 커서 되도록 사용 안했으면 좋겠지만 용량을 봐 가며 사이즈를 줄이는 방식으로 응용이 가능해 보입니다. 마스킹 같은 것을 사용할 때는 이 파일 포맷으로, 사이즈를 좀 줄여서 사용하는 것을  추천드립니다. 그리고 이것 쓸 때 말씀해 주세요. 특별하게 관리해야 하거든요.  최소한 TA가 알고 있기는 해야...  

 

truecolor : 최고의 품질을 보여야 할 때 사용합니다. 1.0M. 당연히 용량이 너무 큽니다. 이걸 쓸 때는 TA의 허락 (...) 을 감히 부탁드리겠습니다. 관리를 아주 잘 해야 하거든요

 

 

 

2. 알파 있을 때 (원본 1.3MB)

 

compressed : 사실상 16bit RGBA와 동일합니다. 0.7MB . 용량도 많이 주는 것도 아니면서, 심각하게 깨집니다... 기본 설정이 이 포맷이긴 하지만, 요새 업계에서도 이 포맷은 사용하지 않습니다. 차라리 알파 없는 텍스쳐 한 장을 더 쓰죠 . 사실상 사용 금지 포맷에 가깝습니다.

 

16bit : 아무 의미 없는 파일 포맷입니다!!! compressed와 동일합니다!!!

 

truecolor : 최고의 품질을 보여야 할 때 사용합니다. 1.3MB. 알파가 있으면서 최고의 품질을 보여야 할 때? 바로 UI 입니다!

기본적으로 NPOT (4의 배수가 아닌) 텍스쳐를 많이 사용해야 하는  UI의 특성상, 16bit나 truecolor를 사용해야 하는데 , 알파가 포함되어야 한다면 거의 선택할 수 있는 여지가 이것밖에 없습니다. (알파를 분리하는 대 작업을 한다면 모르겠지만...)

역시 이 파일 포맷은 UI 외엔 다른데서 사용하려면 반드시 허락이 필요한, 중요 관리 포맷입니다.

 

 

 

 

  1. 그런데 밖에서 DDS로 편집한 녀석은 그대로 들어오더라고요. PC 게임 만드실 분들은 참고하셔도 좋을 듯 합니다. 스마일 게이트 그래픽 팀 분들이 테스트 해주셨습니다. 감사 ! [본문으로]
  2. 압축 안하는 파일포맷을 쓸 때도 있습니다. 대표적인 경우가 UI [본문으로]

댓글을 달아 주세요

  1. 음.. 2015.12.01 12:03  댓글주소  수정/삭제  댓글쓰기

    텍스쳐의 이미지 사이즈도 고려하지 않고 그냥 무조건 큰걸 넣어도 된다는 말씀인가요?
    유닛 텍스쳐를 1024 막 이렇게 써도 되는건가요?
    유니티 어느부분에서 저걸 관리해 준다는 건가요? 궁금..

    • 아싸리망고 2016.01.11 23:54  댓글주소  수정/삭제

      네 저도 테스트해 본 결과 대마왕님 말씀처럼 큰걸가져가든 작은걸 가져가든 유니티상에서 재압축하기 때문에 압축된 최종 용량은 같습니다. 저도 텍스쳐의 기본용량이 작으면 더 많이 압축되지않을까하고
      png 데이터를 png 압축사이트에서 압축해 유니티로 임포트한 후
      기존의 png와 압축사이트에서 용량을 대폭줄인 png 두개를 각각
      Compressed 하였는데 최종용량은 같더군요...ㅎㅎㅎ ㅜ.ㅜ
      빌드시에도 자동으로 이미지들을 압축하는 것 같으니

  2. Favicon of https://gamedevforever.com 대마왕J 2016.01.12 14:40 신고  댓글주소  수정/삭제  댓글쓰기

    네 사이즈도 유니티에서 조절 가능합니다. 처음에는 무조건 퀄리티 높은걸 넣는게 중요합니디

  3. 음...? 2016.03.10 12:28  댓글주소  수정/삭제  댓글쓰기

    들어간 용량은 같아도..메모리에 올라가는게 다를텐데 ; 다 때려박으면 ..메모리가..메모리가..

  4. 음...? 2016.03.10 12:28  댓글주소  수정/삭제  댓글쓰기

    들어간 용량은 같아도..메모리에 올라가는게 다를텐데 ; 다 때려박으면 ..메모리가..메모리가..