프로젝트 D 연구정리.

2018.01.29 18:39

PROTECTED ARTICLE. TYPE THE PASSWORD.

포토샵에서 그라디언트를 그려보면




이케 나오는데요. 


요거요거, 그라디언트 툴을 이용해서 정확히 그린 그라디에이션이예요. 무려 수 학 의 힘을 빌려 그린 거지요. 

차암 정확하겠죠?!??!? 



근데 그거 아세요? 이거 사실은 틀 린 거라는거요 

저거 솔직히 보세요. 너무 어둡지 않아요? 뭔가??? 







실제 제대로 된 그라디언트는 저렇게 안생겼어요 제대로 되었다는 말은 검은색 ~ 흰 색 까지 제대로 된 비율로 증가한다는 거고 

그 그라디언트는 저렇게 생기지 않았다고요!!


지금부터 보여드릴께요. 제대로 된 혼신의 그라디언트를!! 




짜잔. 


이게 여러분들의 모니터에서 볼 수 있는 '제대로 된' 그라디언트입니다. 굉장히 이질적이죠? 이런거 본 적 없죠? 

요거 .. 포토샵에서 그린게 아니거든요. 




넹 요건 유니티에서 수학 연산으로 출력한 그라디언트거든요. 

이게 진짜예요. 


근데 왜 포토샵에서는! 어두워 보이느냐!!


사실 포토샵에서도 제대로 그리고 있어요!!! 


근데 모니터 감마를 거치느라 어두워 진거라고요!! 

그래서 포토샵에서 회색은 진정한 회색이 아닌 겁니다!! 





http://chulin28ho.tistory.com/241



포토샵에서의 128 즉 회색은 진정한 회색보다 많이 어두워얌!!! 사실 187이 더 회색에 가까워얌!!

포토샵에서의 색상 수치값은 사실 우리가 알고 있는 정상값과는 거리가 있는거예얌!!




그래서 무슨 문제냐고요? 




아니 뭐 그냥 그림 그릴땐 문제 없어요 



잘못된 그라디에이션이면 뭐 어때. 그대로 포토샵에 나오는대로 나오면 됐지


그래서 포토샵에서 그린 그라디에이션을 유니티로 가져와 봤어얌. 




아래가 포토샵에서 가져온 거예얌!!! 

그래요!! 뭐 포토샵이 틀렸다고? 뭐 어쩌고 하는데 알게 뭐얌!! 포토샵과 똑같이 가져와 지니 걍 되는거 아닌가염!!!!



그래여 뭐 그냥 텍스쳐 그려서 넘길때는 문제 없어얌. 


네 안심하셈. 



그런데....


셰이더 짜는 사람이나 이펙터나 TA 들에게는 좀 문제가 있어얌!!!


이사람들은 '그림' 데이터가 아닌 '정확한 수치' 데이터를 텍스쳐로 처리할 때가 있단 말예얌!!!!


예를 들어 노말맵. 


이거 벡터 각도를 나타낸 맵이예염. 이건 이쁜게 문제가 아니라 정확해야 한다고. 


그리고 또 마스크맵들. 예를들어 러프니스 맵, 메탈릭 맵 이런거. 


이것도 이쁘라고 그린게 아니라 정확하라고 넣은 수치 데이터잖아!!!!!!!


이런 것들은 이렇게 틀린 그라디에이션으로 그냥 넘어오면 안되얌!!!! 수치가 중요하니까!!! 


그래서 정말 제대로 수치로 넘겨야 할 것들은




이걸 꺼줘야 한다는 거예염!!!!!!!!!!! 저거 봐 봐 sRGB 칼라 텍스쳐라고 되어 있잖아...

즉 칼라 텍스쳐가 아닌 '데이터' 는 저걸 꺼줘야 해염!!! 


그러면 어떻게 되냐면.. 




짠 


같아졌죠 


아래것이 미묘하게 어두운 것 같... 닥쳐 


이게 진짜 '수치적으로 리니어한 그라디언트' 를 눈으로 보는 거예얌. 그리고 수치 데이터 텍스쳐들은 이 옵션을 써야 하는 거임. 








PROTECTED ARTICLE. TYPE THE PASSWORD.

사실 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에 실시간으로 영향을 준다는 것입니다. 


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