사실 10편에 라이트맵 설명은 모두 끝냈습니다만, 

라이트맵은 같이 쓰면 좋은 것들이 좀 있습니다. 약점을 보완할 것들이지요. 


그 중에서 라이트프로브 정도는 정말 같이 쓰는 것이 좋습니다... 



LightProbe



라이트맵은 어떤 모드건 Static과 Dynamic이 완벽히 연결되지 않습니다. 

아예 Dynamic을 무시해 버리는 Baked모드는 제외하더라도, 나머지 라이트맵 기능들 모두 Static과 Dynamic이 완벽히 연결되지 않지요 


'연결되지 않는다' 라는 말은 크게 두 가지로 말합니다. 




1. 그림자가 연결되지 않는다 



다이나믹 그림자가 스테틱 오브젝트한테 드리워지는 것은 되는데, 

스테틱 그림자가 다이나믹 오브젝트한테 드리워지는 것은 안 되는 문제 


- 리얼타임 라이트맵(Realtime Lighting) 은 제외

- 디스턴스 셰도우 마스크(Distance Shadowmask) 도 제외 



2. GI가 묻어나지 않는다 


스테틱의 GI가 다이나믹 오브젝트한테 어떤 영향도 끼치지 못한다는 문제 



여기서는 일부러 GI를 잘 보이라고 엄청 과장했습니다만, 그래도 다이나믹 오브젝트에는 어떤 영향도 끼치지 못한다는 것을 볼 수 있습니다. 



이 두 가지 경우를 아쉬운대로 해결해 줄 수 있는 기능이 바로 LightProbe 입니다 



이 라이트 프로브를 ... 에디트 모드로 해서 복사해 줍니다. 


색 변화가 급격한 곳은 조밀하게, 변화가 거의 없는 곳은 러프하게... 


어디 겹쳐서 안으로 들어가는 일이 되도록 없게 해 줍니다. 



이렇게요. 


조밀하게 할 수록 퀄리티가 높아지지만 그만큼 무거워진다는 것만 알아두시길


물론 기본적으로는 매우 가벼운 녀석이긴 합니다. 


복사 단축키인 Ctrl+D 를 적극적으로 이용하시면 만들기 편합니다 




이렇게 만들어 주고 나서 다시 구워주면.... 



저 공들에 GI나 그림자 같은 라이트 정보가 입체적으로 구워지게 되고 [각주:1]

이렇게 저장되어 있게 됩니다. 물론 게임에서는 저렇게 보이진 않지요. 저건 순수한 기즈모일 뿐입니다. 




그렇지만 애석하게도 아직까지는 쓰기 좀 그렇습니다. 원래보다 좀 밝게 구워지는 버그가 있어서 결국 셰이더를 좀 손봐야 할 필요가 있는 상태입니다. 차기 버전에서는 고쳐지길 기원합니다 (일해라 유니티) 



뭐 하여간 좀 밝긴 하지만 이렇게 GI가 구워져서 근처에 있는 다이나믹 오브젝트가 GI를 받을 수 있게 됩니다. 


대충 이런 느낌으로 주변에 구워져 숨어 있던 라이트 프로브에게 빛 효과를 받을 수 있게 되는 것입니다. 






또한 이것은 밝은 면 만이 아닌 어두운 정보도 구워지게 되어서, 


'스테틱 오브젝트에게 그림자를 받을 수 없다' 라는 것도 어설프게나마 해결을 할 수 있게 해 줍니다. 

물론 이전에 말한대로 버그는 좀 있지만. 





이렇게 라이트 프로브를 같이 사용하면, 라이트맵의 한계를 보완할 수 있습니다. 



여기에 이제 반짝이는 녀석은 리플렉션 프로브를 이용해야 하지만... 귀찮으니까 그건 진짜 .. 다음에 할께요... 

여러분 안녕... 난 이제 다시 공부하러 갈거예요.... 




  1. 사실 공으로 보여서 그렇지 공은 아닙니다만.. [본문으로]

Mixed Lighting - Subtractive



이제 Mixed Lighting의 마지막 옵션인 substractive입니다.

이 방식은 좀 더 전통적인 방식의 라이트맵이며, Mixed 계열 중 가장 가볍고 가장 퀄리티가 떨어지는 방식입니다. 


옵션은 아래와 같이 해 주면 끝입니다 



이렇게 하고 구워 보면...




구워진 이미지 보면 이전하고 똑같은 느낌입니다. 뭐가 바뀌었는지 잘 모르겠지요 


그렇지만 구워진 이미지를 보면 다릅니다. 

이렇게 한 장에 모든 GI와 그림자가 다 구워지는 것이 subtractive의 특징입니다.

그냥 한 장에 몽땅 처리하는 거지요 


즉 조명 + 그림자 + GI가 한 번에 구워진거라 사실상 Baked에다가 Dynamic 오브젝트의 라이트와 그림자 기능을 추가한 것 밖에 없습니다. 


때문에 현재 보이는 Static 의 라이트와 그림자는, Dynamic의 라이트와 그림자와 아무 상관이 없습니다. 



즉 이렇게 아무 상관 없는 그림자와 빛이기 때문에, 조명의 색상을 바꾸면 Dynamic 오브젝트에게만 적용됩니다. 

또한, 그림자끼리 겹치면 자연스럽게 섞이지 않고 확연한 이질감이 납니다. 



이것은 라이트 옵션에서 그림자의 색상을 조절할 수 있게 되어 있는 것으로 예상할 수 있는 일입니다. 

실제로 라이트 창에서 실시간 그림자의 색상을 조절해 보면 확연히 느낄 수 있게 됩니다. 


'바닥에 구워진 그림자와 대충 비슷하게 해서 눈치채지 못하게 색상을 수동으로 정해라' 라는 거지요 



때문에 이 방법은 Mixed Light에서 가장 가볍고 가장 퀄리티가 떨어지는 방법이며, 

Static 오브젝트와 Dynamic 오브젝트를 서로 자연스럽게 연결시켜주는 어떤 장치도 없습니다. 그저 수동으로 해야 할 뿐... 



이 방식은 워낙 간단해서 더 설명할 것도 없네요. 


이게 다입니다 다라고요. ㅋ 



Mixed Lighting - ShadowMask



Distance ShadowMask 



이전 시간에 이은 , 셰도우마스크의 추가 옵션입니다. 

2017 초기 버전에는 라이트맵 옵션에 같이 있었는데, 곧 따로 빠진 기능입니다. 


이 기능을 만든 이유는 다음과 같은데... 




ShadowMask로 리얼타임 셰도우와 베이크드 셰도우를 통합해서 자연스럽게 섞이게 된 것 까지는 좋은데, 

여전히 남아있는 문제는... 


Static 오브젝트의 그림자는 어쨌거나 구워진 것이기 때문에, 다이나믹 오브젝트에 드리우지는 못한다 

라는 것입니다. 


위 그림에서도 박스의 그림자가 바닥에는 드리워져 있는데 캐릭터에게는 드리우지 못하고 있는걸 알 수 있지요 


이건 구워진 그림자나 GI들의 숙명입니다. 


그래서 이걸 해결하는 법은 몇 가지가 있긴 한데, 그 중 하나가 바로 이번에 소개시켜드릴 옵션입니다. 


이 옵션은 가동시키기 위해서 다시 굽거나 할 필요는 없습니다. 그래서 아마 라이트맵 옵션에서 빠진듯.

그냥 이상태 이대로 바꿔주면 됩니다. 


바꿔주는 곳은 Edit/ Project Settings/ Quality




에서 여기에 있습니다 




여기서 Distance Shadowmask를 선택해 주면, 




캐릭터에 그림자가 먹습니다. 



어라 왜 먹는거지???


상식적으로 아무리 셰도우마스크로 구웠다 하더라도 구워진 텍스쳐라 다이나믹 오브젝트한테 영향을 줄 수 없을텐데???





이게 Distance Shadowmask의 차이입니다. 별 거 아니예요


일단 이건 실시간 그림자 거리와 상관 있습니다. 


이 부분이요. 


일단 저 거리가 뭐냐면.. 

실시간 그림자가 생기는 거리입니다. 


Distance Shadowmask 모드일때, 저 거리 안에 들어 있는 부분은 완벽한 실시간 그림자들로만 만들어집니다. 



즉 위 그림에서 붉은 영역으로 보이는 부분이 실시간 그림자 가능 거리이고, 이 때 Distance Shadowmask 일 때에는 저 영역 안에 들어있는

'모든 그림자는 실시간 그림자' 이라는 것입니다. Static 이니 Dynamic이니 상관없이 모두 Dynamic으로 동작하니, 당연히 저 박스의 그림자가 캐릭터에 드러워지는 것을 알 수 있습니다. 



그런데 실시간 그림자 거리가 짧아지거나, 카메라에서 오브젝트가 멀어져서 실시간 그림자 영역을 벗어나게 되었을 때 

그 그림자들은 다시 원래대로 Baked Shadowmap과 Realtime Shadowmap으로 나뉩니다.
그러면 다시 Static 오브젝트가 Dynamic 오브젝트에게 그림자를 드리우지 못하게 됩니다. 

 

위 그림에서 박스가 캐릭터에 그림자를 드리우지 못하는 것을 보면 알 수 있습니다. 



위의 내용을 다시 보면 아래와 같습니다. 




Mixed Lighting - ShadowMask


새로 생긴 ShadowMask 기능입니다. 일단 옵션만 바꿔서 무식하게 구워 볼까요 



물론 다른 옵션은 바로 이전 글인 7편과 동일합니다. 위에 보이는 저 옵션만 다르다고 생각하시면 돼요. 

아래는 이전과 동일합니다. 




이전의 Baked Indirect 옵션이 '라이트와 그림자는 실시간으로, GI 만 라이트맵으로' 였다면 

이건 '라이트는 실시간이고, 그림자는 셰도우맵으로 굽고, GI는 라이트맵으로 굽고' 라는 겁니다. 




그래서 구워진 결과물을 보면 ... 뭐 잘 모릅니다. 


자 여기서 잘 생각해 봐야 합니다. 


- 라이트는 실시간이라서 색이나 강도를 변화시킬 수 있습니다. 

- 그림자는 셰도우맵으로 구워진거라 움직이거나 변화할 수 없습니다. 

(단 Dynamic 오브젝트의 그림자는 실시간이므로 움직일 수 있습니다)  

- GI는 라이트맵으로 구워진거라 움직이거나 변화할 수 없습니다. 


즉 이렇게 된다는 겁니다 

위 글을 아래 그림과 비교해 보세요 





그럼, 구워진 라이트맵을 봅시다 



오오 역시 말한대로 GI와 셰도우맵이 '따로' 구워졌습니다. 


이렇게 셰도우맵을 굳이 따로 굽는 이유는 다음과 같습니다. 


일단 먼저 얘기할 것은, '실시간 그림자도 사실은 셰도우맵(Shadowmap)에 실시간으로 그려지는 텍스쳐' 라는 것입니다. 

여기 보이지는 않지만 사실 다른데에 그렇게 그려지고 있어요. 

그리고 스테틱 오브젝트의 그림자도 리얼타임 셰도우와 같은 '속성' 을 지니는 셰도우맵에 구워진 겁니다. 위에 보이는 붉은 색 이미지가 그거입니다.  


이렇게 굳이 그림자를 따로 독립해서 굽게 되면 좋은 점이.. 



'구워진' Static 오브젝트의 그림자와

'실시간인' Dynamic 오브젝트의 그림자가 


완벽히 어울린다는 것입니다. 왜냐? 같은 셰도우 맵에 그려지고 있으니까요! 


이걸 위해서 굳이 그림자만 따로 떼어서 셰도우 맵에 그리는게 ShadowMask 기능입니다. 

이렇게 되니까 조명의 색상이나 강도를 바꾸는건 실시간으로 해도 별 문제 없어지는 겁니다. 


이 기능은 Mixed Lighting에서 가장 고급스럽고 품질좋은 (무거운) 옵션 중 하나입니다

라이트맵을 굽고 나서도 라이트의 색상과 강도는 수정할 수 있다는 장점도 있고요 




ShadowMask의 한계 


이 기능의 한계점은 '그림자의 갯수 제한이 있다' 라는 것입니다. 

아무래도 그림자만 셰도우맵 텍스쳐에 굽다 보니까, RGBA 에 따라 4장까지 그림자를 표현할 수 있는 것이지요 


다음과 같이 그림자를 4개 만들어 놓고 라이트맵을 구워보면,



이렇게 ShadowMap이 칼라풀하게 구워졌습니다.


이 맵을 자세히 보면.. .


이렇게 RGBA로 구워진 것을 알 수 있습니다. [각주:1]


그렇다면 4개 이상인 경우는 어떻게 되느냐?!????




이렇게 5개의 그림자가 있는 상태에서 구워보면.. 




5번째 그림자는 라이트맵으로 구워집니다. 

즉 셰도우맵이 아니므로 셰도우맵의 장점이 사라진다는것 [각주:2]


어떤 라이트는 셰도우맵으로 구워지고 어떤 라이트는 라이트맵으로 구워지냐.. 라면 

메뉴얼에서는 보지 못했지만 여태까지 유니티에서 하던 일반적인 순서로 보자면

1순위 디렉셔널 라이트

2순위 가장 밝은 라이트 (혹은 가까운 라이트) 

이므로 여기서도 그 순위를 따를듯



그리고 이건 Light Overlap 에서도 확인할 수 있습니다. 




  1. 언리얼에 있는 스테이셔너리 라이트와 동일한 구조를 가지고 있는 것으로 보입니다. 그것도 인라이튼이니. [본문으로]
  2. 셰도우맵이 아니라 그냥 라이트맵으로 그림자를 구우면 어떤 단점이 있는지는 다음 옵션 인 Subtractive 설명때.. [본문으로]

Mixed Lighting


이제 그다지 오래 지나지 않아 인라이튼은 사라진답니다! 오예! 

임시로 들어가 있던 프로그래시브 라이트매퍼가 인라이튼을 대체한답니다! 오예! 이 글을 쓰는 나는 망했다!! 망했다고!!! 

누가 쓰라고 하지도 않았는데!! 왜 쓴걸까 난!! 난 망했어!!! 이 글은 이제 곧 쓸모없는 글이 될거야!!! 




망하는건 망하는거고.. 쳇.


하여간 하던건 마무리 지어야 하니까. 


이제 드디어 Mixed Lighting 입니다. 여기서는 또 3개 (4개) 로 나눠서 설명해야겠네요 


어쨌건 Mixed Light로 설정하는 법은 다음과 같습니다. 


- 조명은 Mixed로 

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

- Realtime Lighting은 끄고 (안꺼도 상관없지만 끄는걸 권장) Mixed Lighting은 켜고 원하는 Lighting Mode를 선택 


즉 조명은 전부 아래처럼 설정해 주시면 됩니다. [각주:1]





이제 드디어 Mixed Lighting 입니다. 여기서는 또 3개 (4개) 로 나눠서 설명해야겠네요

이 메뉴 부분은 2편에서 설명했으니 다시 설명하지는 않겠습니다. 


 



그리고 냅다 구우면 이렇게 됩니다. 세부 옵션들은 다시 초기화 시켜놨습니다. 



Mixed Lighting - Baked Indirect



Mixed Lighting 에서 첫 번째 선택 매뉴는 Baked Indirect 입니다

이전에 설명해 놓은 것 처럼, 이 옵션은 'GI만 굽고 그림자는 실시간' 이라는 옵션입니다. 


그래서 이렇게 나왔네요 


드디어 다이나믹 오브젝트에도 빛과 그림자가 받아지기 시작합니다 ㅎㅎ 

 

라이트맵은 어떻게 구워졌는지 볼까요 


확실히. GI 와 엠비언트 라이트 밖에 보이지 않습니다. 


Directional Light와 그림자는 구워지지 않았어요 



그럼 이제 이 전 시간에 배웠던 대로 라이트맵 옵션을 올려서 퀄리티를 올려 봅시다 

어차피 구워지는 부분은 Baked랑 완전히 동일하니까요 


옵션은 이걸 참고하시고요. 

여기서 원하는대로 개량하셔도 좋을 것 같습니다. 라이트맵 사이즈라던가 말이죠 



이렇게 구웠는데도, 안쪽에 왠 빛줄기가 보입니다. 


저것은 리얼타임 라이트와 셰도우의 문제로, 라이트맵의 문제가 아니라 실시간 쪽의 문제입니다. 


실시간 그림자 (Shadowmap) 의 정밀도 문제로 오차가 생긴 거지요 


이걸 해결하려면, 실시간 그림자의 해상도를 올리거나 ( = 거리를 줄이거나) 

아니면 실시간 라이트의 Bias를 줄여서 처리해야 합니다. 



여기서는 거리보다는 Normal Bias가 훨씬 효과가 있군요. 물론 저렇게 되면 지글대는 Fight가 나오지 않을까 걱정해야 합니다만.. 



어쨌건 이렇게 해서 잘 완성 되었습니다. 




물론, 욕심을 더 부리고 싶다면... 


캐릭터가 녹색 벽 근처에 가면 자기도 녹색 GI를 받고, 

붉은 벽 근처에 가면 자기도 붉은 GI를 받게 해주고 싶을 수도 있습니다. 

지금은 그건 안되지요. GI는 이미 텍스쳐로 구워진 상태니까요 


물론 이 때에는 라이트 프로브를 이용하면 가능해 집니다. 그건 정말 다음 기회에.. 





  1. 물론 Baked 라이트와 섞어서 사용도 가능합니다. 그렇게 하면 각각 작동합니다. 심지어 Realtime과도 동시에 구울 수 있습니다. [본문으로]

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. 건드리는 요령이 있지만 그럼 너무 깊어지므로 여기서는 삭제 [본문으로]

Realtime Lighting 


개인적으로 리얼타임 라이팅이라는 말이 마음에 들지 않습니다. 리얼타임 라이트맵이라고 해야 옳지 않나...


A simple example of time of day using Precomputed Realtime GI.

https://docs.unity3d.com/Manual/LightingInUnity.html


그러니까 이런 겁니다. 바닥에 녹색으로 GI가 묻어나는 걸 봐주시길. 조명이 움직이는데도 GI가 먹는다든게 중요한 겁니다. 이래서 리얼타임이라고 불리지만, 오브젝트들은 움직이면 안된다라는 제한(Static) 은 있기 때문에 문자 그대로 리얼타임인 것은 아닙니다. 

하여간 가동시키려면 다음과 같습니다. 




1부에서 했던 것처럼 Static한 녀석과 Dynamic 한 녀석이 존재하는 씬에서 시작합니다. 캐릭터만 Dynamic이고 나머지 배경은 모두 Static. 

라이트맵의 Auto Generate 는 꺼 놓은 상태. 



이제 여기(Window / Lighting/Setting)서 Realtime 라이트만 체크하고 Mixed Lighting은 꺼줍니다. 켜 놓아도 조명 설정이 Realtime이면 어차피 Mixed는 작동 안하겠지만, 그래도 확실한게 보기 좋으니까요 





라이트는 Realtime으로 두면 됩니다. 아참. 그림자는 켜 주시고요 

실시간이기 때문에 그림자 옵션은 필요한대로 만져주시면 됩니다. 

기본 옵션이 Realtime이므로 특별히 따로 만져주실건 없지요 





여기까지 하면 준비 완료입니다. 

즉 리얼타임 라이트맵을 가동시키기 위한 셋팅은 이거입니다. 

- 조명은 리얼타임으로 

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

- Realtime lighting 체크. Mixed lighting은 체크해도 되고 안해도 되고 상관없음. 


이렇게 하고 Lighting에서  Baking(Generate Lighting) 을 하면, 리얼타임 라이트맵이 구워집니다. 



라이트맵이 구워졌습니다. 결과를 보시죠 



왼쪽부터, 약간 바닥에 녹색이 묻어납니다. 녹색 벽면에서 GI가 튕긴거죠. 

그리고 두 번때 화살표 보시면, 바닥에 묻어난 녹색이 뭔가 부자연스럽습니다. 


그리고 오른쪽에는 약하지만 아주 연하게 붉은 끼가 묻어난 것 같아(?) 보입니다. 


이럴땐 Static한 물체를 옮겨보면 잘 알 수 있습니다 .




옮겨보니 확실히 GI가 바닥에 구워진 것을 볼 수 있습니다. 아마 바닥 말고 나머지 오브젝트 들에게도 GI가 구워졌겠지요 

뭔가 바닥이 좀 해상도가 낮아 보이죠? 그래서 부자연스러운 녹색 번짐이 일어났던 것입니다. 


리얼타임 라이트맵의 원리를 조금 더 훔쳐보자면.. 


 



이 쪽을 봐 주면 이해하기 편합니다. 


우선 구워놓은 이미지를 기반으로 Systems을 보죠 



System을 보면, 뭔가 사각형들이 보입니다. (이게 투명으로 보이시는 분들은 아티스트 분들입니다) 

제가 임시로 1m  (유니티의 1유닛) 짜리 박스를 만들어서 올려봤습니다. 녹색으로 보이는 것이 그것이지요 


그걸 올려보면... 체크무늬 4개가 1미터임을 알 수 있습니다. 

따지자면 2*2 로 되어 있는거죠 

즉 퀄리티를 올리고 싶으시면 간단하게 Indirect Resolution 을 올리시면 됩니다. 쉽지요 



이건 여기와 연관이 있습니다 



라이트맵을 리얼타임으로 하면 오직 하나만 옵션이 켜지는데, 이 옵션을 보면 1유닛당 2텍셀이라고 되어 있습죠 

즉 이 단위를 의미하는 것이고, 이게 라이트맵의 정밀도를 의미합니다. 



그래서 이걸 일단 보시면 클러스터링이 이 정도 크기로 잘라져 있습니다. 이게 GI가 연산되는 기본 단위라고 보시면 대충 맞는데요 



이 단위에 따라 Lit (라이트) Clustering이 되신걸 보실 수 있습니다. 



그래서 이 정보를 바탕으로 Indirect GI 가 생성되신걸 보실 수 있습니다. 


즉 정밀도를 2에서 4로 높이면 클러스터가 1/2로 작아지고,  GI 계산이 더 정밀해지는 거죠 




그리고 이 클러스터링을 이용한 GI가 '리얼타임' 인 이유는

클러스터끼리의 GI 연관 속성들이 저장되어 있다고 생각하시면 간단한데, 덕분에 조명이 바뀌거나 텍스쳐의  Emission을 올리면 그게 GI에 실시간으로 영향을 준다는 것입니다. 


그래서 아래와 같은 것이 가능해집니다. 







그럼 이쯤에서 정리 한 번 합시다. 


 

 Static Object

Dynamic Object 

 comment

Realtime Lighting

 Light: Realtime


 Shadow: Realtime(shadowmask)


 GI: Realtime

 Light: Realtime


 Shadow: Realtime(shadowmask)


 GI: Nothing

 -need baking cluster for   Realtime GI. 

 

-Realtime Ambient light

Mixed Light 

 Baked 

Light: Baked


Shadow: Baked


GI: Baked

 Light: Nothing

 

Shadow: Nothing


 GI: Nothing

 -Baked Ambient light

 Baked Indirect

 Light : Realtime

 

Shadow: Realtime(shadowmask)


 GI: Baked

 Light: Realtime

 

Shadow: Realtime(shadowmask)


 GI: Nothing

 -Baked Ambient light

 Shadowmask

(distance 

shadowmask)

 Light : Realtime

 

Shadow: Baked(shadowmask)


 GI: Baked

 Light: Realtime

 

Shadow: Realtime(shadowmask)


 GI: Nothing

- but, baked shadow & realtime shadow are perfect blended by shadowmask.


-Baked Ambient light


- have additional option 'distance shadowmask'

 Subtractive

 Light: Baked


 Shadow: Baked


 GI: Baked

 Light: Realtime

 

Shadow: Realtime(shadowmask)


 GI: Nothing

- baked shadow & realtime shadow are not blended each other
-Baked Ambient light


행여나 알아보기 조금이라도 쉽지 않을까 하고 정리해 봤지만 여전히 알아보기 힘듬 ㅋㅋㅋㅋ


왜 영어로 썼지... 저도 모르겠네요.ㄷㄷㄷ


하여간 저기에 서로 그림자나 GI를 주고 받는 경우까지 들어가면 더 복잡해집니다. 



그럼 다음 차례는 저기 있는 라이트맵들을 하나 하나 보는 것이겠네요. 

일단 RealTime부터...




이제 라이트맵을 저장하는 법을 알았으니, 리얼타임 GI인지 뭔지를 해결해 봅시다. 

그 전에, 라이트맵을 분류하는 법을 알아야 합니다. 


라이트맵은 여러 종류가 있어서, 자신이 원하는 것을 사용해야 하거든요 그리고 더럽게 복잡해졌습니다. 


일단 오브젝트가 Static Dynamic으로 이루어진건 알고 계시겠지요?



Static은 1강에서 봤던 Static 옵션을 체크한 물체로, 게임에서 '절대 움직이지 않는다' 라는 설정이 된 오브젝트를 의미합니다. 

Dynamic은 Static 체크를 안한 물체로, 캐릭터처럼 게임에서 '움직인다' 라는 설정이 된 오브젝트를 의미합니다. 

자 그 두 개가 중요합니다. 


그리고 우리 프로젝트가 어떤 라이트 체계를 가질 것이냐 미리 결정하는 것이 매우 중요합니다. 

아래 소개를 보고 이번 프로젝트에서 원하는 라이트 체계를 결정하세요 



라이트맵의 종류 


RealTime Lightmap 리얼타임 라이트맵



흔히 아는 라이트맵과는 다른 라이트맵입니다. 그림자와 조명 텍스쳐가 생성되지 않고, 클러스터만 생성되어 실시간으로 조명 GI가 발생하는 라이트맵입니다. 


GI는 가지고 싶은데 라이트의 밝기나 위치가 실시간으로 변하고 (하루 시간이 지나가듯), 다이나믹 오브젝트도 동시에 빛 받게 하고 싶을때 사용합니다. 


사실상 리얼타임이기 때문에 '가볍다'의 장점은 거의 없고, GI가 추가된 리얼타임이라고 보는게 좋습니다. GI의 정밀도도 좀 떨어집니다. 그치만 조명에 실시간으로 반응하는 GI는 매력적인걸로.   


Static Object : 실시간 라이트에 반응해서 GI가 발생합니다. 단 라이트맵치고는 좀 무겁고 정밀도가 상대적으로 높지 않은 편입니다. 그림자는 리얼타임입니다. 


Dynamic Object: 빛을 받습니다. 그림자도 나옵니다 뭐 더 필요해요?





Mixed Lightmap 믹스드 라이트맵


예전엔 Baked 라이트맵이라고 불렸던 것이 믹스드로 바뀌었습니다. 뭐 그래도 있을 건 다 있고, 다시 이 안에서 두 개로 나눠집니다. 여기가 좀 어려워요 이 라이트맵은 다시 Baked랑 Mixed로 나눠집니다.  

사실 이 네이밍은 별로 마음에 안들어요 



Baked Lightmap 베이크드 라이트맵


가장 전통적인 의미의 라이트맵입니다. 텍스쳐로 구워지는 그림자와 GI효과가 한 장에 저장됩니다. 

단, 다이나믹 오브젝트한테는 어떠한 영향도 끼치지 않습니다. 

예전엔 Mixed와 완전 다른 의미처럼 분류되었는데, 신형에서는 Mixed 하위 구조로 들어갔습니다.


건축 시뮬레이션처럼, 완전히 고정된 물체만 있고 최고의 품질을 보여주고 싶거나, 빛을 받는 다이나믹 오브젝트가 하나도 없어서 조명 연산을 완전히 제거해 버려 무척 가볍게 하고 싶을 때 사용합니다. 즉 Dynamic 오브젝트가 전혀 없거나, 있어도 배경과 동떨어진 - 만화같은 - 느낌을 주고 싶을때 사용하기도 합니다.


보통 책에 나와있는 전통적인 라이트맵이 이것으로, 가볍기로는 가장 가벼운 방식일 겁니다. 사실상 조명 연산이 하나도 없어지는 거니까요  


Static Object  : 라이트맵이 적용됩니다. GI도 텍스쳐로 구워지고 그림자고 텍스쳐로 구워집니다. 사실상 전통적인 의미의 라이트맵이란 이 녀석입니다.  


Dynamic Object  : 철저히 무시됩니다. 아예 빛과 연산을 하지 않습니다. 위 캐릭터가 조명의 영향을 전혀 안 받는 것을 보십시오. 만약 엠비언트 라이트라도 없었으면 새까맣게 나왔을 겁니다.  



Mixed Lightmap 믹스드 라이트맵


베이크드 라이트맵의 특징이자 단점인, '다이나믹 오브젝트에게는 먹지 않는다' 라는 점을 개선하고자 만든 복합 라이트맵입니다. 이게 진짜 믹스드 라이트맵입니다. 


일단 베이크드 라이트의 특성에 더해서 , 빛을 받는 다이나믹 오브젝트도 동시에 사용하고 싶을 때 사용합니다.

라이트 하나 설치하고 나서 배경에는 베이크드 라이트가 되고, 같은 라이트가 캐릭터에도 실시간으로 적용되고 싶을 때 사용되며 라이트맵 적용한 배경과 실시간으로 움직이는 캐릭터가 같이 자연스럽게 어울려야 할 때 사용됩니다. 


그런데 웃긴게, 이 믹스드 라이트맵이 신형에서는 세부 옵션에 따라 다시 3가지로 나뉘어졌다는 것입니다. 정확히는 4개예요 ㅋㅋㅋㅋ 아 사람 힘들게 진짜...[각주:1]


- Baked Indirect 베이크드 인다이렉트




그림자와 빛은 전부 리얼타임을 쓰고, 'GI와 엠비언트 라이트만' 구워버리는 방법입니다. 그림자는 전부 리얼타임으로 쓰고 싶을때 쓰는 방법이예요. 사실상 GI와 엠비언트가 구워졌을뿐 리얼타임 라이트와 동일하다고 생각하시면 됩니다.  

고품질의 GI를 가지고 싶은데, 그림자와 조명은 상호작용이 복잡해야만 해서 꼭 '전부' 리얼타임 그림자들만 쓰고 싶을때 사용합니다. 사실상 가벼움은 별로 좋지 못하고, GI와 엠비언트가 고정된 리얼타임 라이트맵 같은 느낌입니다. 


Static Object : 라이트맵이 적용됩니다. 근데 GI와 엠비언트만 라이트맵으로 구워집니다. 조명과 그림자는? 전부 다이나믹 라이트와 다이나믹 그림자를 씁니다! 라이트와 그림자만은 리얼타임이예요! 

Dynamic Object : 빛을 받습니다. 실시간 그림자도 나옵니다 뭐 더 필요해요?  




- Shadowmask 셰도우마스크


그림자도 굽고 GI도 굽는 방식입니다만, 이건 특이하게 그림자는 셰도우 마스크로 굽고, GI는 따로 구워서 두 장으로 굽는 방식입니다. 결과적으로는 이후에 말할 Subtractive와 같은 방식입니다만, 그림자랑 GI를 따로 나눠서 굽는다는게 중요합니다. 이게 은근히 중요한 경우가 있거든요 
거기다가 이건 다시 ShadowMask와 Distance ShadowMask로 나뉘어 집니다. 이 옵션까지 지금 설명하는건 너무하므로 나중에 따로 설명하죠 . 

고품질의 GI를 가지고 싶고, 그림자도 구워서 가볍게 만들고 싶은데, 그 와중에 리얼타임으로 반응하는 다이나믹 오브젝트의 그림자와도 완벽히 어울리고 싶을때 사용하는 방법입니다. 우훗 욕심쟁이. 사실상 가장 고급기법이지요. 그리고 이후 설명(언젠가..) 하겠지만 이것도 또 두 가지로 나뉩니다. 

Static Object : GI와 엠비언트를 라이트맵으로 굽습니다. 그리고 그림자(ShadowMask)만 따로 다시 굽습니다. 왜 굳이 따로 그림자를 독립시켰을까요? 아래 그림처럼 다이나믹 그림자 [각주:2] 와 완벽히 어울리게 하기 위해서입니다. [각주:3]

Dynamic Object : 빛을 받습니다. 실시간 그림자도 나옵니다 뭐 더 필요해요?  


이렇게 Static 그림자와 Dynamic 그림자가 완벽히 어울립니다. 

이거 하나 하려고 라이트맵을 분리한거거덩요 




- Subtractive 서브트렉티브




그림자도 굽고 GI도 굽는, Shadowmask랑 같은 방식입니다만, 한 장에 모두 구워진다는게 다릅니다 

예전 유니티 5.x 의 Mixed Lightmap을 기억하시는 분이라면, 이게 그거입니다. 


'어쩐지 좀 어두운 것 같은데요?' 라고 생각하시면 정상입니다. 

위의 것들을 좌악 비교해 보세요, Baked 라이트맵과 이것만 Static이 좀 어둡습니다. 

그것은 일단, 이 두 개는 '조명연산이 텍스쳐로 구워진다' 는 차이입니다. 나머지 둘은 조명연산은 적어도 리얼타임이거든요. 당연히 이 어두운 두 세트가 제일 가볍습니다. 텍스쳐와 리얼타임 라이트의 차이라 스페큘러 연산에서의 차이도 있고 뭐 등등 그래서 좀 어둡습니다. 


역시 다이나믹 오브젝트는 리얼타임으로 조명도 받고 그림자도 받습니다만, 살짝 이질감이 있는건 어쩔 수 없습니다. 


Baked Lightmap의 가벼움이 너무 좋고 매우 중요하지만, Dynamic Object가 조명과 그림자를 받는 것도 포기할 수는 없을 때 사용하면 좋습니다. 뭐 대신 Mixed중에서 퀄리티는 제일 떨어지지요. 



Static : GI와 엠비언트, 그림자와 조명까지 전부 라이트맵 한 장에 구워집니다. 

Dynamic : 빛을 받습니다. 그림자도 나옵니다. 단 여기 그림자는 리얼타임 그림자 (Shadowmap)이라서 구워진 그림자와는 좀 차이가 있습니다. 구워진 그림자는 단지 텍스쳐일 뿐이지 그림자맵이 분리되어 있지 않기 때문입니다. 아래 그림처럼 말입니다. 이것인 ShadowMask와의 결과차이입니다. 








결론


정리하자면 , 라이트맵의 가벼운 순서는 대충 이 정도가 될 듯 하네요 


Baked > Subtractive > ShadowMask > Baked Indirect > Realtime  


라이트맵의 퀄리티는 주관적으로 정하기 애매하기 때문에, 지금 원하시는 프로젝트에 맞게 결정하시는게 좋을듯 합니다. 근데 저것만 가지고 선택하긴 아직 일러요 ㅋㅋㅋㅋ Mixed Lightmap을 사용하면 필수적으로 LightProbe와 ReflectionProbe 까지 같이 고려해야 결정할 수 있기 때문입니다 ㅋㅋㅋㅋㅋ 으앙 ㅋㅋㅋㅋㅋㅋㅋㅋ 으앙 ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ 이거 언제끝내 ㅋㅋㅋㅋㅋㅋㅋㅋㅋ 간단한게 아니잖아 제길 ㅋㅋㅋㅋㅋㅋㅋㅋㅋ


결국 저 라이트맵 옵션별로 하나하나 설명하는 수 밖에 없어보이네요. 



  1. 그나마 프로그레시브 라이트매퍼가 생겨서 이것도 얼마나 갈지... [본문으로]
  2. 다이나믹 그림자도 사실 셰도우마스크를 씁니다 [본문으로]
  3. 이런 류의 단점도 같이 보입니다. 현재 Static으로 구워진 박스의 그림자는 단지 '텍스쳐' 이기 때문에 실시간이 아닙니다. 때문에 박스가 캐릭터에게 그림자를 드리우지 못하고 있습니다.Baked Indirect라면 완벽했을텐데.. [본문으로]



저 안쪽에 빛이 좀 새는것 같지만 뭐 잘 된 것 같은데 뭐가 시작이라고 그러냐...? 하신다면...


뭐 지금 된 건 맞습니다. 맞아요 




근데 지금 뭐가 되었는지는 좀 생각해 봐야 합니다. 


지금 적용된 상태는 리얼타임 GI 가 캐쉬에 저장된 상태 

입니다.  

뭐야 그거 무서워...



일단 캐쉬에 저장된 라이트 데이터를 로컬로 빼보죠 



일단 캐쉬에 저장되었단 얘기는, 이 프로젝트상에서는 저장되지 않았다는 뜻입니다. 


그거 뭐 별 거 아니예요. 프로젝트를 저장하고 Auto Generate를 꺼주기만 하면 라이트맵이 캐쉬가 아니라 프로젝트에 저장되게 됩니다. [각주:1]


일단 프로젝트를 저장하세요 Ctrl + S 면 충분.

저는 Test란 이름으로 저장했습니다. 




그리고 라이팅의 셋팅 창을 여세요 





맨 아래쪽의 Auto Generate를 꺼줍니다. 

이제 수동으로 저기 제네레이트 라이팅 버튼을 눌러줘야 작동해요 

가끔씩 눌러줘야 하는 귀찮음은 있지만 자동으로 베이킹되면서 프로젝트를 느려지게 하는 현상은 없어져서 

저는 거의 모든 경우 저걸 꺼 놓고 시작합니다. 

 


하여간 그렇게 하고 Generate Lighting을 누르면...



씬 이름과 같은 폴더가 생기고, 드디어 라이트맵 데이터가 로컬에 저장되게 됩니다. 

LightingData라고 되어 있네요 



참고로 라이트 캐쉬 저장데이터는 

아래 프리퍼런스를 열면 


GI 캐쉬 항목에서 용량을 볼 수 있습니다. 

최고로 10기가를 차지하게 해 놨고, 지금 그동안 쌓였던 - 다른 프로젝트에서 작업한 것도 다 쌓입니다. 휴지통처럼 - 

캐쉬가 9.88 기가로 C 드라이브를 잡아먹고 있네요. 

이건 자동으로 비워지지 않기 때문에 저 Clean Cache를 눌러줘야 비워집니다. 


하드가 부족하시거나 하신 분들은 날려주시는게 좋겠죠. 아님 위치를 바꿔 주시거나. 

저도 간만에 지워야겠습니다. 


  1. 물론 그래도 캐쉬는 계속 사용됩니다. 라이트맵을 구웠던 정보들은 계속 재사용되거든요 [본문으로]