모바일용이라는게 워낙 베일에 가려진게 많아서리…
어떤 쉐이더를 어떻게 어디까지 써야 하는가가 정확히 알려진게 하나도 없습니다.
일단 아이폰의 쉐이딩 특징으로 그동안 조사되었던 것은
- 아이폰의 그래픽칩은 Tiled 디퍼드 렌더러를 사용하므로, 알파 테스팅은 상당히 엄청나게 느리고 알파 블렌딩이 빠르다.
- 하지만 라이팅은 쥐약이므로, 가능한한 계산하지 말아야 한다. (디퍼드라면서… 라이팅이 제약이 있다고…?)
- 버텍스 연산이 매우 취약하므로 , 버텍스 연산보다는 픽셀연산으로 몰아야 한다.
대충 이정도로 알고 있었는데, 이번에 본격적으로 프로젝트를 시작함에 따라 확실한 테스트로 결과를 뽑아 보았습니다.
(참고로, 예전에 했던 테스트에서는 위의 특징이 모두 맞지 않은 것으로 나왔었습니다)
결론부터 얘기하자면,
예, 저 위의 아이폰 쉐이딩 특징은 현재 하나도 맞지 않습니다…. (이렇게 말하면서도 불안하긴 해요. 정말?)
믿고 싶진 않지만, 테스팅 결론이 그렇게 나와 버렸으니까요…
배경용 기본 쉐이더
DiffuseFast 사용
사실 말씀 드리면, Diffusefast 란 쉐이더는 사실 없습니다. 들어가서 보면 이 쉐이더는 이미 코드가 없어졌고, (옛날 유니티에선 있었지요) 지금은 이 쉐이더를 적용시키면 자동으로 Vertexlit 쉐이더로 넘어가게 되어 있습니다. 즉 DiffuseFast = Vertexlit 쉐이더입니다. 둘 중 어떤걸 적용하셔도 상관 없습니다. 사실 DiffuseFast는 껍데기 뿐이므로 모두 Vertexlit으로 제작하세요! 라고 하는게 정상입니다만 , 이미 익숙해 지신 상태니 그냥 가기로 하겠습니다 :) (하지만 유니티 4.0 에서는 사라질지도 몰라요)
어쨌건 DiffuseFast 와 Diffuse 쉐이더의 싸움입니다. 버텍스 라이팅과 픽셀라이팅의 싸움이지요.
PC에서는 압도적으로 버텍스 라이트가 빠릅니다만…
아이폰에서의 결과는 다음과 같습니다.
Diffuse

Diffuse Fast (Vertexlit)
Diffuse와 DiffuseTest의 차이는 사실상 거의 없습니다. 둘 다 단순히 빛을 dot 연산하여 텍스쳐를 섞어주는 것 외엔 아무 일도 하지 않습니다. 단지, Diffuse는 빛 계산을 픽셀로 하고 DiffuseTest는 버텍스로 한다는 차이 뿐입니다.
테스트 결과 거의 의미없는 수준의 차이가 나왔습니다. 9프레임까지 떨어질 정도로 부하를 올려 봤는데 0.2 프레임 정도 차이라면 오차범위도 되지 않을 레벨이지요.
즉 별 차이가 없는 관걔로 어떤걸 써도 상관없습니다만, 픽셀 라이팅을 사용하는 Diffuse는 해상도에 영향을 받을 수 있는 관계로 해상도와 별 상관이 없는 (버텍스는 해상도에 상관없이 똑같으니까…) DiffuseFast 를 쓰는 쪽이 조금더 안정적이라 생각되어 DiffuseFast 를 메인 쉐이더로 사용하도록 하겠습니다.
각종 오브젝트를 비롯한 기본 프랍들의 쉐이더는 DiffuseFast 입니다.
(단, 나중에 라이트맵이 들어간다면 얘기는 달라지게 됩니다! 이건 그 때 다시…)
====================================================
배경용 알파 채널 사용 쉐이더.
알파 테스팅과 알파 블렌딩의 차이비교
Transparent / Cutout / Diffuse
Transparent / Diffuse
둘다 사용 가능
알파 테스팅은 유니티에서는 Cutout(컷아웃) 이라고 불립니다. 알파 소팅의 문제점을 피하기 위해 텍셀의 블렌딩을 하지 않고, 단순하게 각 픽셀별 알파값을 0과 1로 저장하므로 블렌딩이 없이 칼같은 이미지가 나오게 됩니다. PC에서는 당연하게도 말도 안되게 빠르고 안정스럽습니다
그렇지만 아이폰에서는 렌더러 자체가 블럭으로 렌더링하는 방식이라, 이 방식 자체가 오히려 역효과를 일으킨다고 합니다. 하도 협박들을 많이 하길래 진짜로 어떤가 테스트 해 봤습니다. 즉 아이폰에서는 블렌딩 방식이 더 빠르다는 것이 문서들의 얘기.
테스트 결과는 다음과 같습니다.

알파테스팅 (컷아웃) 사용. 나무들의 잎 경계면이 선명합니다.

알파블렌딩. 나무들의 잎 경계면이 부드럽습니다.
차이는… 0.3 프레임 정도.

차이는 개뿔
두 경우 모두 3프레임까지 떨어질 정도로 데이터를 사용해서 비교해 봤습니다만, 역시 두 방식의 차이가 극히 미미한 관계로 두 방식에서 어느 방식을 사용하는지 제한하지 않도록 하겠습니다. 왠지 문서랑 비교했을때와 달라서 솔직히 찜찜하긴 한데, 결과가 이렇게 나왔으니 믿을 수 밖에 없지요.
주로 그래픽팀은 컷아웃 쉐이더를 사용하시는게 익숙하실테고 또 그렇게 사용하셨을 겁니다. 그렇게 사용하시던대로 사용하시면 되겠습니다. 역시 라이트맵이 들어가면 다르게 생각해야 하지만 말입니다.
라이트맵은 라이트 대신에 맵을 사용하는 것이므로, 다른 쉐이더를 사용해야 합니다.
다음은 캐릭터용 기본 쉐이더와 이펙트용 쉐이더를 올리도록 하겠습니다.