유나이트 서울 2018 강연자료입니다 
이 날 장비문제로 열심히 작업했던 애니메이션이 다 날라가서 너무 가슴아팠던... 

그래서 행여나 애니메이션이 적용된 PPT를 보시고 싶으신 분은 
 

https://1drv.ms/p/s!AsdnEBfz51bLgd1h8ORz4KWR6dBSvQ


에서 받아보실 수 있으십니다. 한시적 공유합니다. 


PDF 공유 주소는 다음과 같습니다. 


https://1drv.ms/b/s!AsdnEBfz51bLgd1jMdcLeyY8NBblrg



이전 포스팅에 따르면 sRGB 모드여도 A 는 리니어 모드라는 가정을 내린다. 

그럼 정말인가 알아보자. 


위에가 RGB 아래가 A 이다. 확실히 아래쪽이 Linear 그라디언트의 특성을 보인다.


그래서 그대로 출력해 보았다. 


확실히 차이가 보인다. 


여기서 첫 번째 가정은 RGB는 sRGB 이고 A 는 Linear 인 것이다. 



그 가정이 맞다면, sRGB를 끄면 RGB가 Linear가 되니 두 그림은 똑같아 져야 한다. 



두둥...


sRGB를 껐지만 결과는 다르다. A는 ... Linear보다 약간 더 제곱한 수치로 보인다. 



그래서 이번엔 반대로 찾아봤다 



다시 원래대로 복구. 


여기서 A 값에다가 2.2 pow를 주면 위에와 똑같아지는가를 찾으면 될 것이다. 


return pow(col.a,2.2);



확실히 아니다. 도대에 A는 무슨 값이란 말인가?


궁금해서 역추적을 해 본다. 


A 가 Linear라면 2.2 제곱을 하면 위의 RGB랑 같을텐데, 안 같고 더 어둡다... 

A는 2.2가 아닌 것인가? 


무식하게 수치를 찾아보자. 


return pow(col.a,1.75);




1.75에서 일치되었다. 


이건 뭘까...? 물어봐야겠다 


덧) 나크님이 닷 그레인 20% 쪽 힌트를 주셨다

즉 포토샵에서도 알파는 다르게 처리한다는 것. 

연구해 볼 필요가 생김




알다시피 텍스쳐는 sRGB 처리가 되면서 Gamma Correction 을 거치기 위해 (뭐 정확히 그것만을 하기 위해서는 아니지만 하여간) 내부적으로 밝아지게 된다. 


그리고 Linear Pipeline에서는 이 텍스쳐는 다시 원래 '선형' 으로 돌아온다. 즉 어두워진다. 그리고 계산된다. 



근데 일단 이건 RGB를 말하는 거다. 


만약 이 이미지에 있는 알파 채널은 어떻게 될까? 예상컨데 동일하게 작동될 것이라 생각할 수 있다. 


즉 회색(감마 코렉션에서 차이가 가장 큰)을 리니어 처리하면, 

회색 - 밝은 회색을 거쳐 - 다시 회색

으로 돌아오므로 

RGB도 A도 동일하게 작동될것이라고 상상할 수 있을 것이다. 


즉 RGB를 회색으로 만들고 A도 회색으로 만들면, 


RGB나 A나 전부 저렇게 반응할 것이라고 생각할 수 있을 것이다. 


sRGB니까. 



그럼 테스트를 해보자. 



포토샵에서 그레이RGB와 그레이A 를 만들었다. 


         


둘은 아무리 봐도 똑같이 생겼다. 


그리고 유니티로 넘겨보자. 


위 가정대로라면 유니티로 넘겨도, RGB와 A가 같은 색이어야 할거다. 



그리고 결과. 



   



놀랍게도 A가 더 밝다! 분명히 전환하면 반짝 하면서 밝아진다!! 




자세히 재 보진 않았지만 느낌적으로 이건 밝아진 상태 그대로이다! 그것도 알파만! 


즉 이런거다. 


sRGB로 이미지를 만들었고 이미지에 sRGB 옵션을 켰다 하더라도 


sRGB는 RGB에만 적용되는거고 

A 는 Linear로 동작하고 있다는 말이 된다. 


즉 RGB만 '이미지' 로 취급하고 있고, A만 '데이터' 로 취급하고 있다는 말이다. 


어쩐지.. 

아래에 보이는 Albedo의 A를 Smoothness에 사용한다는 말이 영 걸리더라... 

그랬더니 지금과 같은 결과가. 

그래 이렇게 되는 거면 저기다 넣어도 아무 문제 없다는 말이다... ㄷㄷㄷㄷ 





프로젝트 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 설명때.. [본문으로]