[그래픽스 최적화] Culling

Date:     Updated:

카테고리:

태그:

Main Reference:
- 유니티 그래픽스 최적화
- Unity Korea


🐳 Frustum Culling

VisualCameraFrustum

앞서 배운 Draw Call을 줄이는 가장 좋은 방법은 낭비되는 draw call을 줄이는 것이다. Culling이란 카메라 뷰 밖에 존재하는 오브젝트나, 다른 오브젝트에 가려져 렌더링할 필요가 없는 오브젝트들을 걸러내는 작업이다. 기본적으로 적용되는 Perstpective Projection을 사용했을 때, 카메라를 통해 화면에 나오는 영역은 위 그림과 같은 Frustum(사각뿔의 절두체) 모양이다.


Free Look View Quater View Top View
1 158551_164211_5942 maxresdefault

Quater view나 Top view 방식의 경우 view frustum의 크기가 커져도 렌더링할 오브젝트의 수가 크게 변하지 않는다. 하지만 Free Look view 방식은 near, far 값에 따라 호출되는 draw call의 갯수가 크게 달라진다. 따라서 Far 값을 적절하게 조절해주며 성능 최적화를 해줘야 한다.


Far value : up Far value : down
2 3

위와 같이 Far 값을 조절함에 따라 Draw call의 갯수가 2064에서 1374로 줄어들었다. 하지만 Far값을 줄이게 되면 보여야 할 오브젝트들이 보이지 않아 어색한 씬이 렌더링 되어버린다. 이런 문제점은 Fog Effect를 적용하면 자연스럽게 해결이 가능하다!

4


Spatial Partition

Quad Tree Octree
Q O

좀 더 들어가서, 오브젝트가 카메라 뷰(view frustum)에 포함되는지 어떻게 판단할 수 있을까? 트리 구조를 이용해 공간을 분할하고(spatial partition), 씬의 특정 영역이 카메라 뷰와 겹치는지 여부로 판단한다(bounding box 기준). 2D의 경우 씬을 4등분(Quad-tree) 해가며 트리 구조를 만들고, 3D의 경우 8등분(Octree)을 해가며 트리 구조를 만들게 된다.


5


🐳 Occlusion Culling

Occlusion Culling Setting
culling S

Occlusion Culling은 다른 오브젝트 뒤에 가려진 오브젝트들을 걸러내는 기법이다. 주로 좁은 공간에 많은 오브젝트들이 존재하는 실내 씬에서 많이 사용된다. Culling에 사용되는 타입은 다른 오브젝트를 가리는 애(Occluder), 다른 오브젝트에 의해 가려지는 애(Occludee) 두 가지가 존재한다. Occluder는 주로 크기가 크고 움직이지 않는 static type에 적용하고, Occludee는 static, dynamic 모두 적용 가능하다. 세팅에는 다음 세 가지의 값들이 존재하는데 이는 정해진 최적값이 없고, 씬마다 다른 매직넘버이다. 또한 문처럼 열릴 떄, 닫힐 떄 culling이 바뀌는 경우 사용하는 Portal이란 component가 존재하고, 여러 개의 카메라를 사용할 때 쓰는 culling mask component도 존재한다.


🐳 Level of Detail (LOD)

LODGroup-width

LOD를 이용해서도 Culling 작업을 수행해줄 수 있다. Frustum Culling의 경우 Far plane 경계값에 의해 렌더링이 on/off 되지만, LOD Group을 이용한 culling의 경우 화면 픽셀의 몇 퍼센트를 차지하는지에 따라 culiing 여부를 지정해 줄 수 있다. 따라서 거리가 아주 멀지는 않지만 크기가 작아 있으나 없으나 하는 오브젝트들을 렌더링 하지 않는 방식으로 draw call을 최적화하는 방식이다.



맨 위로 이동하기

Unity 카테고리 내 다른 글 보러가기

댓글 남기기