* 비밀글 해제.
============================================================================================================
이 작업의 목적은 퍼포먼스 향상입니다. 뭐냐면 일단 우리 프로젝트의 라이트 구조에 대해 또 얘기해야만 합니다.
우리 프로젝트의 라이트구조는 아주 노멀한 포워드 렌더링 구조입니다. 저사양과 옛날 기기에 어울리는 방식이긴 하지만, 실시간 라이트 (특히 포인트 라이트) 를 추가하면 하나 추가할 때마다 전체를 다시 한 번 그려야 하므로 고급 옵션으로 가면 갈수록 기하급수적으로 느려지는 단점을 가진 렌더링 구조였습니다.
그래서 눈물을 머금고 라이팅 개수를 제한해야 했고, (픽셀라이트 2개) 그렇게 해야 겨우 권장사양에서도 프레임을 유지할 수 있었습니다. 하지만 이것도 안정되었다고 말하기는 힘든게, 앞으로 무슨 변수가 어떻게 생길지 모르고, 또 가능한한 더 빠르게 만들 수 있으면 금상첨화인 것이었지요. 참고로 픽셀라이트 2개라는 것은, 총 3번 그린다는 말입니다. (버텍스라이트 + 픽셀라이트 + 픽셀라이트) 그러므로 일반적으로 드로우콜이 5개인 캐릭터는 픽셀라이트 2개 허용상태에서는 드로우콜이 15개가 된다는 말이지요.

뭐 캐릭터가 한두마리 있으면 별 상관 없습니다만, 만일 캐릭터가 많아지게 되면? 30마리만 되어도 원래 30*5 = 150 드로우콜이었던 것이 150*3= 450 드로우콜까지 상승하게 됩니다. 순수하게 캐릭터만 300 드로우콜을 추가로 잡아먹게 되는거지요. (드로우콜이 프레임에 언제나 최고로 강력한 영향을 끼친다고는 할 수 없지만 어쨌거나 크건 적건 효과가 있는건 확실합니다)
그런데 우리 게임은 캐릭터의 크기가 작고, (상대적으로) 배경보다 버텍스가 뭉쳐 있으며, 제작 스타일도 일루미네이션 기능을 사용함으로써 라이트의 영향을 줄여버리는 작업 스타일을 보이고 있으므로, 사실 정밀한 픽셀라이트까지는 별 필요가 없었습니다. 약간 간략화 되어 있는 버텍스 라이트를 써도 퀄리티는 충분히 보장된다는 생각에서 시작한 작업이었죠.
그러므로 목적은 간단했습니다.
캐릭터는 현재 픽셀라이트 옵션이 몇 개가 되건 상관없이 무조건 버텍스 라이팅으로만 연산되게 하자!
아시다시피 버텍스 라이팅은 분명히 픽셀보다 작습니다. 그렇지만 늘 그렇지는 않은게… 캐릭터가 작게 보여서 몇 픽셀 안될 때에는 오히려 픽셀 계산이 빠르단 말이죠…. 하지만 또 삼품 캐릭터는 버텍스도 그만큼 적습니다. LOD라도 들어가게 되면 더할테고… 어쨌건 라이트 개수에 따라 패스가 안도는 것만 해도 분명 퍼포먼스의 향상은 일어날 겁니다. 뭐 블라블라… 어쨌건 하는 겁니다.
그치만 아쉽게도 림라이트 같은 픽셀 쉐이더 연산의 기능을 제공하면서 라이팅만 버텍스로 도는 방법은 기본으로 지원해 주지 않았습니다. 덕분에 이틀동안 고생하면서… 결국 순호스승님의 도움을 받아 완성했습니다. 라이트는 버텍스로 계산되고, 림라이트 같은 효과는 픽셀에서 계산되는 특이한 라이트 구조를 가진 (겜브리오 등이라면 별로 안특이합니다만 유니티에서는 특이한) 캐릭터 쉐이더를 말이죠.
뭐 말이 어렵다 하시는 분은 이렇게 생각하시면 됩니다.
- 저렴한 라이트로 바꿔서 여러 마리 캐릭터 나올때의 쉐이더 부하가 감소되었습니다.
- 그럼에도 예전 쉐이더랑 모양차이는 거의 없습니다.
결과물은 다음과 같습니다.
이게 기존에 사용하던 캐릭터 쉐이더입니다. 군주 가슴에 염색 되어 있고, 원래 있던 라이트에 추가해서 강한 두 개의 포인트 라이트를 추가로 첨가했습니다. 하나는 분홍색 하나는 연두색. 빛을 받고… 림라이트도 나오고 … 뭐 잘 됩니다.
이게 바꾼 버텍스 라이트 쉐이더입니다. 옵션이나 기능은 모두 동일합니다만, 사실 라이트 적용되는게 살짝 밋밋해집니다. 그치만 따로 보면 잘 모르고, 비교해 봐야 알 수 있습니다.
이게 원래의 픽셀라이트를 이용한 쉐이더입니다. 드로우콜이 291이 되어 있는걸 보실 수 있으십니다.
이게 버텍스 라이팅을 바꾼 쉐이더입니다. 드로우콜이 10이 줄었습니다.
퀄리티는 차이를 느끼기 힘들 정도입니다.
다시 옛날 쉐이더때의 비교입니다. 캐릭터 30마리일때 드로우콜이 847이고, 프레임은… 약 23-24 프레임이었습니다. (캡쳐 프로그램 가동때문에 저기는 느리게 나왔스빈다 )
새로 바뀐 쉐이더입니다. 기능이나 이미지는 동일하면서, 드로우콜은 무려 542로 300이 줄었습니다. 프레임은 약 3-4 프레임이 상승해서 26~27 정도가 나왔습니다. 예상보다는 엄청난 효과가 나오지 않아 다소 실망스럽습니다만, (아마도 캐릭터 크기가 작아 픽셀연산의 단점이 상당히 상쇄되었을 겁니다 ) 어쨌건 향상은 분명히 있었습니다. 그리고 이 테스트 이후에 월드 노말 연산을 버텍스로 옮겼기 때문에, 조금 더 향상이 있었을 겁니다.