Baked Light


이번엔 전통적인 Baked Lighting 입니다. 


말그대로 텍스쳐로만 모든 것을 구워버리는 방식이지요. 


이걸 하기 위해서는 다음을 준비해야 합니다. 


- 조명은 Baked로 

- GI 적용을 원하는 오브젝트는 Static으로 

- Realtime Lighting은 끄고 (안꺼도 상관없지만 끄는걸 권장) Mixed Lighting은 켜고 (Lighting Mode는 상관없음)



조명은 일단 전부 이렇게 설정해 주시면 됩니다. 그림자는 라이트맵 해상도에 영향받기 때문에 여기서 옵션을 바꾸는게 의미도 없고 활성화도 되지 않습니다. 




라이팅 옵션은 이렇게 해주면 됩니다. 

Realtime Lighting은 켜줘도 리얼타임 라이트가 실제로 존재하지 않으면 동작 안하겠지만 꺼주는게 아무래도 깔끔하죠 




그리고 구우면 이렇게 됩니다. 



몇 가지 이상한 일이 일어났습니다. 


1.  GI가 있긴 하지만 뭔가 연하고, 빛도 Realtime일 때보다 밝지 않다 


: 조명의 모든 계산이 텍스쳐가 되어서 그렇습니다. 조명 계산이었던 것이 텍스쳐 연산이 되면서 밝기의 차이가 발생합니다. 일반적으로 Realtime일 때보다 조명이나 효과가 살짝 어둡게 됩니다. 


뭐 좀 강제로 밝게 만들 수도 있기는 하겠지만 기본적으로 이건 포기하는걸로 




2.  주전자가 이상하게 검은 점이 생겼고 모든게 엉망이다 


: 라이트맵이라는 '텍스쳐' 를 구워서 오브젝트에 입히기 위해서, 모든 오브젝트는 '겹쳐지지 않은' 두 번째 채널의 UV 가 필요합니다. 

유니티에서 기본 생성한 물체는 다행히 UV가 겹치지 않게 원래 펴져 있어서 문제가 없게 되었지만 맥스같은 3D DCC 툴에서 가져온 모델링들은 (특별히 2nd UV를 펴지 않는 한) 라이트맵 UV가 생성되어 있지 않습니다. 그래서 저렇게 라이트맵을 적용하면 UV가 엉망으로 나오게 되는 것입니다. 

제대로 2nd UV 펴는 것은 고급 기법이긴 합니다만 여기서는 간단한 튜터리얼이므로 기본으로 내장된 기법을 사용하겠습니다 



이렇게 모델을 선택하고 Generate Lightmap UVs 를 선택하고 Apply 해줍니다. 이렇게 해서 라이트맵 UV가 생겼습니다. 이제 다시 라이트맵을 구워주면 문제 없습니다. 

외부에서 가져온 모델링은 모두 이걸 해 줘야 한다고 생각하면 편합니다. (세부 내용을 설명하고 싶은 욕심을 참는다...) 


이건 이렇게 해결 




3.  캐릭터 (Dynamic)가 그림자가 없고 , 파랗다 


파란 것은 환경광(Ambient Light) 를 받아서 그런 것이고... 

그림자만 없는 것이 아닐 겁니다. 사실 주광인 디렉셔널 라이트도 받지 못하고 있어요. 

현재 하나 있던 유일한 Light를 Baked로 바꿔 놨기 때문에, 리얼타임 라이트가 하나도 없는 상황이 되어 버렸습니다. 

그래서 다이나믹 오브젝트인 캐릭터는 빛을 전혀 받지 못하고 있는 것입니다. 이건 어쩔 수 없어요. 

그냥 환경광 ( Ambient Light) 만 받고 있어야 합니다. 


그러므로 이건 포기 









다음 단계 - 퀄리티 올리기 






해결할 것은 하나밖에 없군요. 해결하고 다시 구워 보겠습니다 



잘 구워 졌습니다. 시간도 꽤 오래 걸립니다. [각주:1]


조금 문제가 보이는군요. 박스 안쪽에 빛이 새어 들어온 것이 보입니다. 해상도를 올려도 사라지지 않네요 

그리고 주전자도 문제입니다. 자동으로 UV를 펴주다 보니 오차가 좀 생기는 느낌.



여기에 이제 몇 가지 옵션을 만져주면 퀄리티가 좀 더 좋아집니다. 


Lightmapper 


인라이튼이 기본입니다. 그리고 더 신형이자 아직 연구단계인 프로그래시브 라이트매퍼를 선택할 수 있습니다. 

프로그래시브 라이트매퍼가 완성되면 이 글은 쓸모없어집니다. 힝입니다. 


Indirect Resolution 


간접광. 즉 GI 의 해상도입니다. 일반적으로 Lightmap Resolusion 의 1/10 정도가 어울린다고 유나이트 샌프란에서 발표된 적이 있습니다. 일반적으로 크게 건드릴 일은 없습니다 


Lightmap Resolution 


말그대로 라이트맵의 해상도입니다. 크면 좋지만 용량이 늘어나고 계산양도 압도적으로 증가합니다. 

요령이 있는데, 처음에 프리뷰로 인라이튼을 구울 때에는 이 수치를 확 낮춰주고 테스트하다가 마음에 들면 수치를 올려주고 구워주면 좋습니다. 


 


Lightmap Resolution 을 5로 내려주고 구운 모습입니다. 모양은 엉망이지만, 대략적인 느낌은 볼 수 있는데다가 정말 순식간에 구워져서 보기 편합니다. 초기 색감잡을때 쓰시는걸 추천합니다 



Lightmap Padding 


라이트맵에 배열된 UV들 사이의 여유값입니다. 보통 건드리지 않아도 충분합니다. 


Lightmap Size


라이트맵 크기입니다. 예를들어 라이트맵 해상도를 40으로 했는데 Plane이 20미터라면, 40*20 = 800 픽셀이 필요하게 됩니다. 즉 해상도를 올리면 이 라이트맵 크기를 늘려줘야 제대로 나옵니다. 라이트맵 해상도는 보통 크게 쓰는 녀석이 아닙니다만, 너무 해상도가 떨어진다 느껴질 때에는 늘려주십시오



Compress Lightmap


이 기능을 체크하면 라이트맵을 압축해서 용량을 줄이는 대신 퀄리티를 떨어뜨립니다. 

그 차이가 크므로 가능하면 체크를 끄는 쪽이 좋다고 생각됩니다 . 위 이미지를 이 옵션을 끄고 걸면 제법 그럴듯 해 집니다. 




Ambient Occlusion 


일명 '그림자 안의 그림자' '환경 차폐' 현상을 위한 메뉴입니다. 구석진 부분을 인식해서 환경광을 제거해서 보다 더 어둡게 만들어줍니다. 여기에는 세 가지 옵션이 있는데, AO 인식 거리와, 간접광으로부터 생기는 AO와 직접광으로부터 생기는 AO 입니다. 일반적으로 건드리지 않아도 좋은 결과가 나옵니다. 

결과물이 꽤 좋아서 꼭 켜는 쪽을 추천합니다만, 계산이 꽤 느리므로 거의 마지막에 켜는 것을 추천드립니다. 



Final Gather 


화면에 보이는 것을 기준으로 AO를 연산하는 방법입니다. 보이지 않는 쪽의 계산은 약합니다만, 적어도 보이는 쪽의 계산은 좀 더 좋아집니다. Ray Count를 올리면 좀 더 정밀해지고, 이 숫자가 적거나 부족할때 보이는 noise를 제거하는 Denoising  옵션이 있습니다. GI 에서 생각보다 부정확한 결과가 나올때 같이 해주면 좋습니다 ,


즉 지금 설명한 것을 적절히 적용하여 작성한 결과물은 다음과 같습니다. 옵션과 결과물을 참고하시기 바랍니다. 

처음보다 확실히 결과물이 좋아졌음을 보실 수 있습니다. 



구석진 부분의 빛샘이 사라지고, 구석진 부분에 AO가 들어가면서 이미지가 착 가라앉게 되었습니다. 







남은 일 - 추가적인 요령 




Directional Mode 


라이트맵에 노말맵이 적용되길 원한다면 Directional로, 필요 없다면 Non Directional로 해주시는게 좋습니다 

Directional일 때에는 라이트맵이 한 장 더 생기게 됩니다. 

즉 지금과 같이 노말맵을 전혀 쓰지 않은 상태에서는 꼭 꺼주는게 좋습니다. 쓸 데 없이 라이트맵이 두 배로 늘어나게 됩니다. 


       


Indirect Intensity

Albedo boost 


둘 다 GI의 강도를 높여주는 기능을 가지고 있고 일반적으로 건드리지 않는게 좋지만, 좀 더 화사한 느낌의 GI를 만들고 싶을때 임의로 올리면 됩니다. 간접광 강도를 높여주면 말그대로 GI의 강도가 올라가게 되고, Albedo를 높여주면 튕기는 빛의 색상이 Albedo 를 따라가게 되어 좀 더 색상이 화사해 집니다. 


Lightmap Parameter 


라이트맵의 세부적인 고급 속성들을 조절할 수 있게 해 줍니다. 기본적인 퀄리티에 따른 프리셋이 되어 있으므로 이걸 선택해줘도 되고, 아예 안건드려도 일반적으로는 큰 문제 없습니다. [각주:2]



  1. 사실 주전자에는 끊어진 면 (seam) 이 보입니다. 아무래도 자동으로 펴는 것은 그다지 깔끔하진 못합니다 [본문으로]
  2. 건드리는 요령이 있지만 그럼 너무 깊어지므로 여기서는 삭제 [본문으로]