Tiling와 Offset을 활용한 2개의 압축텍스처 최적화

반응형

알고있기로는 압축텍스처를 쓸 경우 aos는 2의 승수로, ios는 걍 무조건 2의승수 정방으로 해야 한다.

그래서 aos는 가장 가까운 2의 승수, 120x500 이면 128x512로 변환되지만 ios는 512x512가 된다. 

aos와 ios버전의 텍스처를 따로 관리할 게 아니라면(사실 이건 프로젝트가 커질수록 좀 힘듬..)

처음부터 텍스처 관리를 잘 해줘야한다.


우선적으로 생각해야할 부분이 aos에서 ETC2를 사용할까 말까에 대한 결정이다.

ETC2 자체로는 ETC1을 대체하기 위해 나온 개량형이다.

게다가 용량도 작고 알파까지지원된다!!!.

그런데왜 고민을 해야하는 걸까?

우선 모든 aos폰이 etc2를 지원하는것이 아니기 때문이다.

etc2는 open gles3.0에서 돌아간다.

그렇다면 그 es2.0 버전에서는 어떻게 되는가? etc2로 설정해도 잘 나오던데!!

이럴경우 기기에서 지원되지 않는 텍스처 압축방식이라 비압축 rgba32형식으로 압축된

텍스처와 함께 메모리에 저장되고, 이러한 경우 텍스처압축을 푸는 만큼 시간도 걸리고

메모리 공간도 더 많이 필요하게된다.

즉, 지원은 하지만 es2.0대 디바이스에서는 하드웨어적으로 더 손해다.


그래서 나는 아직은 etc1을 더 선호하고, 만약 알파가 필요하다면 etc1 두장을 사용한다.

하나는 rgb를, 나머지 하나에는 rga에 알파값을 넣어서 사용하면 꽤 훌륭한 퀄리티를 볼 수 있다.

이에 대한 내용은 아래 링크를 참조하면된다.


여기서 말하고자 하는 것은 etc2를 사용하지 않고 rgba32대신 etc1 두장으로 

사용할 수 있는 리소스(2의 승수)에 한해서, 거기에 이 두장을 합치면 정방이 될 경우에

Tiling와 Offset을 활용하여 작업을 할 수 있다는 것이다.


이미지 1 : 256x512, etc1, color texture

이미지 2 : 256x512, etc1, alpha blending용 texture

알파블렌딩 셰이더를 만들어 인자로 두 텍스처를 각각 넣어줬었다.

하지만 이렇게 하면 텍스처로 두장을 관리해야 하고 ios에서는 512x512 2장이 되어버린다.

물론 이 방식이 etc2와 pvrtc를 사용한다면 한장으로 가능하겠지만 etc2를 사용하지 않는 경우

etc1두장으로 가야하고 이러면 ios에서는 크게 혜택을 보지 못하기 때문에 

이미지 1과 이미지 2를 합쳐서 512x512를 만들고 아래와 같이 설정해서 사용한다.

위 Particle Texture와 Mask 텍스처는 하나의 이미지 이고 color 부분은 x가 0~0.5,

아래 mask 부분은 0.5~1.0으로 사용한다.

이미지 1,2와 이 둘을 합쳐 실제 사용하는 이미지3은 공개가 힘드므로 패스.

공개가능한 예제이미지는 만들기 귀찮아서..ㅜㅜ.


Reference Link

- unity, non power of 2

- 유니티에서 etc2 텍스처 사용 시 애매한 사항들

- rgba32 bit texture를 etc 4bit texture 2장으로 사용하기

-

'Optimizing > Common' 카테고리의 다른 글

Dark Secrets of Shader Development  (0) 2017.12.14
rgba32 bit texture를 etc 4bit texture 2장으로 사용하기  (0) 2016.08.23
adreno profiler  (0) 2016.08.19
TAGS.

Comments