본문 바로가기
유니티 엔진

Unity lightmap troubleshooting 유니티 라이트맵 트러블 슈팅

by 대마왕J 2017. 12. 6.



일단 학생작품은 아닙니다. 외부 분입니다. 


그렇게 복잡하지 않은 씬인데 라이트맵이 이상하다는 글이 올라와서 갑자기 없던 흥미가 생겨서 (...왠일로) 

프로젝트를 받아서 간만에 트러블 슈팅을 해 보았습니다 


평소에는 저희 학교 - 청강대 - 학생작품을 주로 했었는데 일단 학생들 졸업작품보다 쉬워보여서 (...)


일단 문제가 되는 씬을 받아 라이트맵을 구워 보았습니다. 


 그 전체 체크해야 할 항목들이 있지요. 

- 라이트는 Bake 모드인가 

- 오브젝트들이 Static은 되어 있는가 

- 오브젝트들에게 라이트맵 UV는 펴져 있는가


일단 기본적으로는 모두 되어 있는걸 확인했습니다. 가장 기본적인 문제는 일단 없다는것. 


그래서, 라이트맵을 구워봤습니다. 





확실히 뭔가 이상하긴 합니다. 

라이트맵인데 라이트 느낌은 나지 않는 건물들, 

이상하게 밝은 건물 하나, 

검뎅이가 묻어있는 나무들. 


하나하나 잡아보도록 하죠


일단 이 허옇게 뜬 이상한 건물과 

아래쪽에서도 묘하게 번진 이상한 건물 빛 부터 잡아볼까요 



당장 이 건물부터 봅시다. 

모두 Attach 되어 있네요. 



아... 그런데 건물이 모두 다른 메터리얼인데 전부 Attach 가 되어 있어서 하나로 취급되고 있습니다. 

이것의 문제는, 전부 하나로 만들었음에도 불구하고 메터리얼이 여러 개이므로 어차피 오브젝트가 갈라져서 콜수가 증가하므로 최적화의 장점이 하나도 없고, 어떤 오브젝트가 어떤 메터리얼을 썼는지 체크하기도 힘들며, 

치명적으로 라이트맵이 이 오브젝트들을 하나의 라이트맵에 넣으려 노력한다는 것입니다. 

그래서인지 저기 라이트맵쪽에 Object's size in lightmap has reached the max atlas size 라고 

라이트맵의 사이즈가 너무 작다는 얘기가 나오게 된 겁니다. 


그럼 얼마나 작은지 볼까요 





저 큐브가 일단 1*1*1미터입니다. 좋은 기준이죠 


저 격자가 그래서 보통 10미터입니다. 플렌 하나 만들고 대 보시면 맞을 겁니다. 


그러므로 지금 이 건물들이 나열되어 있는 도로의 길이는... 


140미터쯤 되는군요 




그런데 현재 라이트맵의 셋팅을 보면 유닛당 20텍셀, 쉽게 말해서 1미터에 20개의 픽셀로 라이트맵을 그리겠다는 말입니다. 

그리고 라이트맵의 최대 해상도는 1024입니다. 


이걸로 대충 계산해 보면, 1미터에 20픽셀이니까 1024 픽셀로는 51.2 미터밖에 표현 못한다는 말이 되네요 

한 장으로는 절대 집어넣지 못합니다. 


그래서 라이트맵 사이즈가 너무 작다는 말이 나온 겁니다. 



이것은 Plane도 마찬가지입니다. 200미터 짜리인데, 1024 픽셀로 1미터 20텍셀로는 처리하기 힘듭니다. 

그래서 역시 이것도 경고가 나옵니다. 

즉 이 경고가 나오면, 실제 해상도보다 상당히 작은 사이즈로 억지로 라이트맵이 구워질 것이기 때문에 라이트맵이 제대로 생겨먹을거라고 예상할 수 없습니다. 


즉 , 

한 오브젝트에는 한 메터리얼

이라는 것을 지켜 주시는 것이 낫습니다. 지금 같은 경우는 각각의 건물을 Attach 시키지 말고 전부 따로 불러온 다음에 유니티에서 배치하는 것이 더 좋았을 겁니다. 관리도 편하고, 그러면 차라리 라이트맵이 여러 장이 될 지언정, 라이트맵이 작아지는 일은 일어나지 않겠지요 .



하지만 


그것보다 더  의심스러운 수치를 발견했습니다. 


Indirect Light Resolution 0.01....

인다이렉트 라이트. 즉 간접광 수치죠 이 수치의 '해상도' 입니다. 강도가 아니라. 

즉 이렇게 되면 인라이렉트 라이트가 적용된 간접광의 해상도가 그렇지 않아도 부족한 상황의 1/100 이 되어 버려서 

그야말로 '벽 하나 당 한 픽셀' 수준이 될 겁니다. 만약 이 간접광이 강하기라도 한다면, 어떤 건물은 심하게 타버리는 증상도 나올 수 있겠지요 




... 그리고 현재 4배 강했습니다 ... 

간접광, 즉 튕기는 라이트가 4배로 강한데 그나마 해상도가 1/100이라서 거의 건물 하나당 한 픽셀 수준이라서 어디로 튈지 모르는 수준이었습니다 


그래서 일단 이 간접광 해상도를 1로 바꾸어 보았습니다. 그래도 라이트맵보다는 1/20이 낮지만

뭐 간접광은 덜 정확해도 괜찮으니 뭐가 나올겁니다. 



4배로 강한 간접광의 정체가 이제 드러났습니다. 이제 간접광이 제대로 보이기 시작하네요 


일단 이것만 줄여도 꽤 괜찮을 것 같습니다 



여기서 간접광이 더 약하게 튕기길 원한다면 저 수치를 더 줄여주는게 좋겠습니다 




그럼 그 외에도 자질구레한 것을 수정해 보겠습니다 




일단 지금은 거의 사용할 필요가 없는 모바일 쉐이더에다가, 사용되지도 않는 노말맵에 스페큘러의 샤이니스 수치는 최고입니다. 이 쉐이더는 필요 없으니 일반 레거시 Diffuse로 전부 바꿉니다. 다른 것들도 모두 바꿉니다. 나뭇잎만 빼고요 


당장 저렇게 놔두면 노말 좌표가 이상하게 동작해서 조명이 제대로 표현 안될 가능성이 큽니다. 노말맵이 있을걸 상정하고 연산하니까요 


Diffuse 로 전부 바꾼 결과물입니다. 




이제 제대로 나오고 있습니다. 


나무가 심하게 좀 어두운데, 




라이트맵 파라미터에서 Is Transparent를 체크해 줍니다. 






조금 나아지긴 했습니다만, 워낙 나무 폴리곤이 적어서 빛 계산이 완벽하지 못합니다. 



그럼 이제 추가로 해주면 좋을 것들을 해줍니다. 


라이트맵 압축을 꺼 줍니다. 모바일 저사양 기기에서나 쓸 옵션이죠 


AO를 켜 줍니다. 구석진 부분 음영인데, 두 가지가 있습니다. 

간접광 AO와 직접광 AO

둘다 1로 해 줍니다. 


마지막으로 라이트맵 해상도와 텍스쳐 사이즈를 올리고 구워 줍니다. 






이 정도로 괜찮지만 , 앞으로 몇 가지 시험해보면 더 좋을것들이 있습니다. 


- 모든 셰이더를 Standard로 바꿉니다. 

현재 모든 옵션이 터무니없이 가볍습니다. 셰이더를 올려도 충분할듯. 라이트맵을 적용하면 이 셰이더도 꽤 잘돌아갑니다. 


- 포스트 프로세스 

역시 아직 씬이 너무 가벼우므로 해보면 좋습니다. 



간단히 해 보면.. 




뭐 이렇게 되겠죠 


손댈건 더 많지만 여기까지.. 





반응형

댓글