본문 바로가기
유니티 엔진

유니티(Unity) 의 뷰 프러스텀 (View frustum)컬링

by 대마왕J 2015. 2. 6.

카메라에는 보이는 영역, 원뿔 .. 은 아니고 사각뿔 영역이 있습니다.

이 영역을 View frustom 뷰 프러스텀 이라고 하고, 이 영역 안에 있으면 화면에 보이는 걸로 치고 렌더링합니다.

 

http://en.wikipedia.org/wiki/Viewing_frustum

 

 

네 뭐 좋습니다. 안보이면 안그리고 딱 좋지요.

보이면 그리는 겁니다.

 

하지만

 

 

이따만한 오브젝트가 있을 때, (2만 폴리곤이군요)

 

 

 

그 와중에 화면에 요따시만큼만 보일 때, 어떻게 될까요?

 

우선, 이 오브젝트는 보이는 건가요? 안보이는 건가요?

 

... 네 보이는 겁니다. 큰 오브젝트의 폴리곤 하나라도 보이면 이 오브젝트는 '보이는 겁니다'

 

CPU는 매 프레임마다 이 화면에 어떤 오브젝트가 있는지를 검사하고 있습니다. '일' 을 하고 있는거지요. 일을 하면 당연히 자원이 듭니다. 그런 입장에서 보았을때, 이 2만 폴리의 플렌은 반드시 '보이는' 겁니다. 네 뭐 그렇지요.

어디 진짜인가 실험해 보죠. 플레이를 해 봅니다.

 

 

 

네 오브젝트는 하나이므로 드로우콜은 1입니다. 뭐 오케이

그리고 폴리곤은... 여전히 2만입니다!!! 그렇습니다. 끄트머리 하나가 보였는데도, 이 2만 폴리 플렌은 다 보인다고 계산되고 있습니다. 픽셀 드로잉 연산은 좀 벗어날 수 있어도 버텍스 연산은 얄짤없이 전부 계산하고 있습니다.

 

이것을 제가 강의할때 주로 하는 비유로 말하면, '만리장성의 벽돌 하나만 보여도 만리장성은 다 보이는 거랑 같다' 라는 겁니다.

그렇다면 방법은 없을까요? 네 방법이 없지는 않습니다.

 

 

 

오브젝트를 이렇게 디테치 시키는 겁니다. 맥스에서.

 

그렇게 되면 총 9개의 오브젝트가 되는 거지요!!! 그렇게 하고 다시 끄트머리만 보면...?

 

 

 

짜잔

 

 

폴리곤이 1/10으로 줄었습니다. 만세!!

대충 맞죠 . 9개로 나눴으니까 말이죠. 이렇게 보이는 녀석만 보이게 되는 겁니다.

 

 

만세

 

 

정말 좋아진 것 같습니다. 와아 그럼 여러개로 막 나누면 좋을까요? 더 자질구레하게 나누면 좋을 거잖아요

 

물론 그렇지는 않습니다. 이렇게 나누면 처리해야 하는 폴리곤은 줄어드는 대신...

 

 

 

전부 다 한번에 보자, 드로우 콜이 9가 되었습니다!!!  

폴리곤 양보다 더 무서운, 드로우 콜이 늘어나거든요. 이렇게 전체를 볼 때는 말입니다.

즉 이렇게 한 화면에 들어오는걸 여러 개로 자르는건 오히려 더 퍼포먼스의 낭비가 일어나게 됩니다.

 

 

 

 

이럴때는 차라리 안 나누는게 더 좋아요. 한 화면에 전부 보인다면 말입니다. 이럴때는 앞에 썼던 방법이 오히려 좀 더 효율적입니다.

 

 

 

결론내리다면, 기본적으로 '드로우 콜을 줄여야 하는데, 그렇다고 폴리곤이 너무 많아지지 않게끔 너무 안보이는건 잘라라' 가 기본 조건이란 말이지요. 적절한 드로우 콜과 적절한 폴리곤 양의 배분을 위해, 배경에서 이걸 자르는 크기를 잡는건 매우 경험이 필요한 기술입니다.

그러므로

 

'만리장성은 적절한 크기로 잘라야 합니다'

 

 

 

이것을 '프러스텀 컬링' 이라고 하고, 가장 가벼운 지형 최적화 방법중 하나입니다. 유니티 터레인이나 언리얼 랜드스케이프에서도 적용되어 있는 방법이지요 (보통 동적 LOD와 함께 동작할 수 있도록 적절한 사이즈의 청크로 잘라져 있습니다. 안보이지만 안보이지만)

그리고 뭐 모든 엔진의 기본이기도 합니다.

http://hoidu.tistory.com/78

 

 

 

물론 여기에 추가로 버텍스가 안보이면 버텍스를 하나하나 정말 잘라버리는 '클리핑' 이란 기술도 있습니다.

그렇지만 그 기술은... 상식적으로도 컬링보다 더 무겁습니다! ㄷㄷㄷ

그도 그럴 것이, 보이는 버텍스는 남겨두고 안보이는 버텍스를 없애버리게 되면 일단 매 프레임 전체 '버텍스' 의 충돌을 검사해야 하는 데다가 (덜덜덜)

보이는 버텍스를 두고 안보이는 버텍스를 지우면 이번엔 그 중간의 폴리곤이 날라가게 되어서 뚫려 보이게 됩니다 (덜덜덜2)

그러다보니까 클리핑 기술에는 반드시 버텍스를 추가 생성해서 면을 만들어 버리는 기술까지 같이 들어가 있습니다.... (덜덜덜3)

 

 

http://gamercampuk.tumblr.com/post/22716607528/a-brief-history-of-graphics-and-rendering

 

 

이걸 실시간으로 처리한다면 그야말로 엄청난 부하가 유발되는 작업이 되기 때문에 PC 에서도 잘 안쓰는 기법이지요.

(마영전의 옷 처리도 클리핑 플렌을 미리 설치해 놔서 실시간 계산양을 줄였을 정도...)

 

 

 

 

결론적으로 최적화의 기본은 "안보이게 하는 것"이지만, 그 안보이게 하는 기술 자체가 무거운 경우가 많아서 참으로 요령있게 사용해야 하는 영역이라는 겁니다. 그럼 총총

 

반응형

댓글