본문 바로가기
유니티 엔진

유니티에서 오브젝트의 그림자가 끊어지는 현상

by 대마왕J 2020. 6. 5.

간만에 학생작품에서 테크니컬 아트 이슈가 올라왔네요 . 얼마만이냐 +_+ 


일단 이슈는 이것입니다. '그림자가 끊어져요!!!' 


흠. 끊어지네요 정말로. 뭐 저기서 면을 지우거나 하진 않았을테고. 

그래서 파일을 받아다가 분석해 봤습니다. 


의외로 답은 빨리 나왔는데, 


면이 모두 하드엣지입니다 [각주:1] 

일반적으로 게임에서는 여러 가지 이유로 하드엣지를 기피하는 편입니다만, 이것도 그 이유중 하나죠. 

뭐 쓸 때는 써야 합니다만 좀 귀찮은 일이 일어나서, 가급적 안 쓰도록 고려해야 한다는게 문제입니다. 

보통 챔퍼로 엣지를 나눌 때에는 하드엣지를 쓰지 않으려고 - 스무싱그룹을 통일하려고 - 나누는데, 이 모델링은 특이하게도 챔퍼가 모두 하드엣지네요. 





뭐 좋습니다. 그럴 수도 있지요. TA는 그래픽분들의 작업을 존중합니다. 아티스트가 하고 싶은 일은 모두 하게 해 주고 싶지요... 

그럼 하드엣지가 왜 저런 증상을 만드느냐... 하면. 



통상적으로, CSM (캐스케이드 셰도우 맵) 은 해상도가 무한하지 않습니다. [각주:2] 

위의 쿼드는 0.1 배로 만든 것이니까 10cm 짜리네요. 이렇게 작으면 그림자 표현하기 더 비효율적이지요. 


그리고 지금 보시면 알겠지만, 보통 뒷면은 Backface Culling 되고, 뒷면이 보이면 그림자도 보이지 않는 것이 일반적입니다. 

이걸 쉽게 생각해서 'normal이 뒤를 향하면 그림자 계산을 안한다' 라고 생각해도 되겠습니다. 


그런데 이 면들이 


이렇게 있다면 어떻겠습니까? 생각을 해 봅시다. 





빨간 노말 방향의 면들은 조명방향과 마주보고 있습니다. 그림자가 생기겠지요. 

그렇지만 파란 노말 방향의 면은? 애매합니다. 거의 90도거든요 조명과. 



그래서 그림자가 이렇게 됩니다. 


즉 


'하드엣지라서 사실상 모든 면은 끊어져 있는 것과 마찬가지'인데 [각주:3]

'CSM해상도도 낮아서 그림자도 불분명한데'

'몇몇 면은 노말까지 조명으로부터 기울어져서 ' 

저 가운데 면은 그림자 렌더링에서 거의 빠지다시피 하면서 저런 shadow acne 처럼 보이는 끊어짐 현상이 나오게 되는 것입니다. 


그래서 여기 아주 절묘하고 모범적인 그림자 끊어짐 문제가 발생하게 된 것입니다. 




해결책


당연히 해결책은 있습니다. 

가장 좋은 해결책은 '모델링을 수정해서 스무싱 그룹을 전부 통일시킨다' 인데 

자꾸 그래픽 아티스트에게 수정을 요청하는 것도 꽤 귀찮게 하는 일이니, 우리 TA가 해결할 수 있는 방법을 찾아 보겠습니다. 


일단 첫 번째 방법. 


2side Shadow로 셋팅한다. 


요즘 세상이 좋아져서 - 에헴 - 

유니티에도 2side shadow가 들어갔습니다. 

그것도 적용되고 싶은 메쉬 렌더러 한정으로 하게 만들 수도 있지요. 




이렇게 되면, 뒷면인 부분도 그림자 렌더링을 하게 되므로 문제점이 대폭 해결될 것으로 예상됩니다. 


결과는? 



네! 훌륭합니다. 

조명과 거의 90도를 이루는 면에 한해 약간의 실무늬 같은 끊어짐 현상이 나올 가능성이 있지만, 어쨌거나 보기 불편하지 않은 만큼 해결되었습니다. 



 


퍼포먼스에서도 문제 없습니다. 프레임 디버거도 확인해 봤지만, 2side shadow라고 해서 1pass가 증가하는 것도 아니었습니다. 

음 사진에서는 셋 패스 콜이 1 늘어난 것 처럼 나왔네요? 


아하 다시 확인해 보니 그림자를 받는 플렌이 생기니 셋 패스 콜이 증가합니다. 그냥 배치가 증가하는 것은 아니지만 어쨌거나 상태변환 정도의 부하는 있는 거군요 


어쩐지 공짜로 해줄리는 없지. 뭐 한정적으로 사용하면 될 것 같으니 괜찮네요. 





두 번째 방법. 


스무싱 그룹을 통일시킨다. 


모델링을 수정하지 않고??? 가능합니다. 

이것은 모델러가 실수로 스무싱 그룹을 하지 않았던가, 스무싱 그룹을 하는게 더 예쁘다고 판단되는 상황이라면 할 수 있는 일입니다. 


이것은 일단 Project 창에서 오브젝트를 직접 선택하고 해야 하는데요. 



선택하고 보면, Normals 부분이 있습니다. 


이 부분을 Import(불러들임) 모드에서 , 새로 계산하는 Calculate 모드로 바꿔봅니다. 




그리고 스무싱 소스를 각도로 바꾸고, 적당히 스무싱 되게 하고 싶은 한계각도를 적어주고 Apply를 눌러주면.. 




짜잔. 모든 면이 스무싱 되었습니다. 



그림자에 2side를 걸지 않아도 문제가 없습니다. 음영도 부드럽고요. 대신 박스 윗면 가운데 부분의 음영까지도 다 사라져 버렸는데, 이건 ㄱ 자로 꺾여있던 노말이 다 평준화 되면서 대각선으로 바뀌면서 그것마저 부드럽게 되어 버린겁니다. 오히려 저기다가 챔퍼를 넣었어야 했는데 말이지요!!!  


그리고 부수적으로, 당연하게도 스무싱 처리를 한 쪽의 버텍스가 압도적으로 가볍습니다. 

스무싱을 한 쪽이 693, 원래대로 스무싱 안한 쪽이 934 네요. 


이게 더 예쁘다면 이렇게 하면 좋겠지요!!! 저라면 추천할 것 같네요!!!! 



  1. 스무싱 그룹이 하나로 되어 있지 않고 갈라져 있는 상태 [본문으로]
  2. 컨텍트 셰도우 기능이나 UE5 에서 사용한 기능들은 이걸 극복한 듯 하지만요. [본문으로]
  3. 노말이 여러 개가 될 수 없으니 버텍스를 복제해서 끊게 됩니다 [본문으로]
반응형

댓글