크거나 작은 느낌의 인상 만들기
머티리얼, 셰이더 및 텍스처(Materials, Shaders & Textures)

오클루전 컬링(Occlusion Culling)

오클루전 컬링은 다른 오브젝트에 가려(오클루전된) 카메라에 보이지 않는 오브젝트의 렌더링을 비활성화하는 기능입니다. 3D 컴퓨터 그래픽스에서는 대부분의 경우 카메라에서 먼 오브젝트가 먼저 그려지고 더 가까이 있는 오브젝트를 차례차례 덮어서 쓰기 때문에 이런 일이 저절로 발생하지는 않습니다(“오버드로우”라고 불림). 오클루전 컬링은 절두체 컬링과는 다릅니다. 절두체 컬링은 카메라의 표시 영역에서 벗어난 오브젝트의 렌더러를 비활성화하지만 오버드로우에 의해 안 보이게 된 것을 비활성화하지 않습니다. 오클루전 컬링을 사용하면서도 절두체 컬링의 이점을 누릴 수 있습니다.

미로 같은 내부 레벨입니다. 노멀 씬 뷰에서는 보이는 모든 게임 오브젝트를 나타냅니다.
미로 같은 내부 레벨입니다. 노멀 씬 뷰에서는 보이는 모든 게임 오브젝트를 나타냅니다.
일반적인 절두체 컬링은 카메라의 뷰에 있는 오브젝트만 렌더링합니다. 자동적으로 언제나 일어납니다.
일반적인 절두체 컬링은 카메라의 뷰에 있는 오브젝트만 렌더링합니다. 자동적으로 언제나 일어납니다.
오클루전 컬링은 근처의 오브젝트에 의해 완전히 가려지면 카메라 렌더링 작업에서 추가 오브젝트를 제거합니다.
오클루전 컬링은 근처의 오브젝트에 의해 완전히 가려지면 카메라 렌더링 작업에서 추가 오브젝트를 제거합니다.

오클루전 컬링 프로세스에서는 잠재적으로 보일 수 있는 오브젝트 집합의 계층 구조를 빌드하기 위해 가상 카메라로 씬을 살펴봅니다. 데이터는 런타임 시점에 각 카메라가 무엇이 보이고 무엇이 보이지 않는지 확인할 때 활용됩니다. 이런 정보를 바탕으로 Unity 는 가시적인 오브젝트만 렌더링하도록 합니다. 이에따라 드로우 콜 수가 줄고 게임의 퍼포먼스는 향상됩니다.

오클루전 컬링에 사용되는 데이터는 셀로 구성돼 있습니다. 각 셀은 씬의 전체 바운딩 을 분할한 것입니다. 보다 구체적으로 말하자면 셀은 바이너리 트리로 구성되어 있습니다. 오클루전 컬링은 두 개의 트리를 활용해 하나는 뷰 셀들(정적 오브젝트)에, 다른 하나는 타겟 셀들(움직이는 오브젝트)에 사용합니다 뷰 셀들은 가시적 정적 오브젝트들을 정의하는 인덱스 리스트에 매핑되어있고 정적 오브젝트들을 위한 좀 더 정확한 컬링 결과를 제공합니다.

게임 오브젝트를 만들 때 이와 같은 사실을 꼭 기억해야 합니다. 왜냐하면 오브젝트의 크기와 셀의 크기 사이에 균형을 이뤄야하기 때문입니다. 이상적으로는 셀이 오브젝트에 비해 너무 작거나 여러 셀을 포함하는 오브젝트를 만들어서는 안 됩니다. 때로는 큰 오브젝트를 작게 분할해 컬링을 개선할 수 있습니다. 반대로 작은 오브젝트를 병합해 드로우콜을 줄일 수 있는데 같은 셀에 속하는 한 오클루전 컬링은 영향을 받지 않습니다.

‘오버드로우’ 씬 렌더링 모드를 활용해 오버드로우가 일어나는 정도를 확인할 수 있습니다. 또 게임 뷰의 통계 정보 패널에서 렌더링되는 삼각형, 버텍스, 배치의 수를 볼 수 있습니다. 아래는 오클루전 컬링을 적용하기 전후를 비교한 그림입니다.

오버드로우 씬 뷰에서 가시적 벽 너머의 많은 방이 렌더링되면서 오버드로우의 높은 밀도를 주목하세요. 게임 뷰에서는 보이지 않음에도 시간을 들여 렌더링했습니다.
오버드로우 씬 뷰에서 가시적 벽 너머의 많은 방이 렌더링되면서 오버드로우의 높은 밀도를 주목하세요. 게임 뷰에서는 보이지 않음에도 시간을 들여 렌더링했습니다.
오클루전 컬링이 적용되면서 멀리 있는 방은 렌더링되지 않았으며 오버드로우의 밀도도 훨씬 덜합니다. 게임 뷰의 모습은 유지하면서도 렌더링된 삼각형과 배치의 숫자가 급격히 줄었습니다.
오클루전 컬링이 적용되면서 멀리 있는 방은 렌더링되지 않았으며 오버드로우의 밀도도 훨씬 덜합니다. 게임 뷰의 모습은 유지하면서도 렌더링된 삼각형과 배치의 숫자가 급격히 줄었습니다.

오클루전 컬링(Occlusion Culling) 설정

오클루전 컬링을 활용하려면 몇 가지 수동 설정이 필요합니다. 먼저 레벨의 지오메트리를 적당한 크기로 분할합니다. 또한 벽, 건물 등 대형 오브젝트에 의해 가리는 작고 제대로 정의된 영역에 레벨을 배치하면 좋습니다. 이는 각각의 메시가 오클루전 데이터를 기반으로 활성화 혹은 비활성화된다는 개념입니다. 따라서 방 안에 모든 가구를 포함하는 오브젝트가 하나 있다면 가구 세트 전체가 컬링되든지 컬링이 아예 안 될 것입니다. 가구를 조각내어 각각 자체 메시를 만들어 카메라의 시점에 따라 각각 컬링되도록 하는 것 만큼이나 의미가 없는 일입니다.

오클루전을 적용하고자 하는 모든 씬 뷰는 Inspector 에서 Occluder Static 에 태그를 붙여야 합니다. 가장 빠른 방법은 오클루전 계산에 포함시키고자 하는 오브젝트를 다수 선택하고 Occluder StaticOccludee Static 로 체크합니다.

오클루전할 오브젝트를 마킹
오클루전할 오브젝트를 마킹

어떤 경우에 Occludee Static 를 사용해야 합니까? 다른 오브젝트를 가리지 않는 투명한 오브젝트와 작은 오브젝트는 Occluders 가 아닌 Occludee 에 체크합니다. 이는 다른 오브젝트에 의한 오클루전에는 고려되지만 그 자체가 오클루더는 아닌 것으로 간주돼 계산을 줄여줍니다.

LOD 그룹을 사용할 때, 베이스 레벨 오브젝트(LOD0)만 오클루더로 사용할 수 있습니다.

오클루전 컬링 창(Occlusion Culling Window)

오클루전 컬링을 처리하는 대부분의 작업에서 오클루전 컬링 창을 활용해야 합니다(Window->Occlusion Culling).

오클루전 컬링 창에서 오클루더 메시와 오클루전 영역 작업을 할 수 있습니다.

Occlusion Culling WindowObject 탭을 표시중이고 씬에서 [메시 렌더러](class- MeshRenderer)를 선택하면 관련 정적 플래그를 수정할 수 있습니다.

메시 렌더러용 오클루전 컬링 창
메시 렌더러용 오클루전 컬링 창

Occlusion Culling WindowObject 탭을 표시중이고 오클루전 영역을 선택하면 관련 OcclusionArea 프로퍼티 작업을 할 수 있습니다(자세한 내용은 오클루전 영역 섹션을 참조하십시오).

오클루전 영역용 오클루전 컬링 창
오클루전 영역용 오클루전 컬링 창

참고: 오클루전 영역을 전혀 생성하지 않으면 기본적으로 오클루전 컬링이 전체 씬에 적용됩니다.

참고: 카메라가 오클루전 영역 바깥에 위치할 때마다 오클루전 컬링이 적용되지 않습니다. 따라서 카메라가 있을만한 곳을 커버하도록 오클루전 영역을 설정하는 것이 중요합니다. 하지만 오클루전 영역이 너무 넓으면 베이킹에 비용이 듭니다.

오클루전 컬링 - 베이크(Occlusion Culling - Bake)

오클루전 컬링 인스펙터의 베이크 탭
오클루전 컬링 인스펙터의 베이크 탭

오클루전 컬링 베이크 창에는 “기본 파라미터 설정” 버튼이 있어 베이크 값을 Unity 의 기본값으로 초기화할 수 있습니다. 전형적인 여러 씬에 유용하지만 씬의 특정 콘텐츠에 맞도록 값을 조정하면 보다 나은 결과를 얻을 수 있습니다.

프로퍼티

프로퍼티 기능
Smallest Occluder 오클루전 컬링을 실행할 때 다른 오브젝트를 가리는 가장 작은 오브젝트의 크기입니다. 해당 크기보다 작은 모든 오브젝트는 절대 다른 오브젝트를 가리지 않습니다. 예를 들어 값이 5 라면 5 미터보다 크거나 넓은 오브젝트는 이 오브젝트 뒤에 있는 오브젝트를 컬링합니다(렌더링하지 않아 렌더 시간을 줄입니다). 적절한 값을 선택해야 오클루전 정확도와 오클루전 데이터의 저장 크기 사이에 균형을 이룰 수 있습니다.
Smallest Hole 카메라가 보게 되어 있는 지오메트리 사이의 가장 좁은 간격을 나타내는 값입니다. 값은 구멍을 통과할 수 있는 오브젝트의 지름입니다. 카메라가 들여다봐야 하는 미세한 균열이 씬에 있다면 최소 구멍 값은 간격이 가장 좁은 크기보다 더 작아야 합니다.
Backface Threshold Unity 의 오클루전은 후면 테스팅을 통해 불필요한 디테일을 줄이는 데이터 크기 최적화를 사용합니다. 기본값은 100 으로 양호하며 데이터셋에서 후면을 절대 제거하지 않습니다. 값이 5 라면 가시적 후면이 있는 포지션을 근거로 데이터를 급격하게 줄입니다. 일반적으로 올바른 카메라 위치에서는 여러 후면을 볼 수 없습니다. 터레인의 아래쪽 뷰나 닿을 수 없는 솔리드 오브젝트 사이의 뷰가 그 예입니다. 100 미만의 임계값에서 Unity 는 데이터셋으로부터 이런 영역을 전부 제거해 오클루전의 데이터 크기를 줄입니다.

베이크 탭의 하단에는 클리어와 베이크 버튼이 있습니다. 오클루전 컬링 데이터를 생성하려면 Bake 버튼을 클릭합니다. 한 번 데이터가 생성되고나면 시각화 탭에서 미리보기와 오클루전 컬링 테스트를 할 수 있습니다. 결과가 만족스럽지 않다면 Clear 버튼을 클릭해 이전에 계산한 데이터를 제거하고 설정을 조정하며 다시 베이킹합니다.

오클루전 컬링 - 시각화(Occlusion Culling - Visualization)

오클루전 컬링 인스펙터의 시각화 탭
오클루전 컬링 인스펙터의 시각화 탭

씬의 모든 오브젝트는 바운딩 영역의 크기에 영향을 미치기 때문에 씬의 가시적 바운드에 있도록 유지합니다.

오클루전 데이터를 생성할 준비가 끝나면 Bake 버튼을 클릭합니다. 이 때 Bake 탭의 Memory Limit 을 선택합니다. 값이 작을수록 생성이 빠르고 부정확해지며 값이 클수록 품질이 릴리즈할 제품 수준에 가까워집니다.

오클루전 데이터의 생성에 걸리는 시간은 셀의 레벨, 데이터 크기, 선택한 퀄리티에 좌우된다는 점을 기억해야 합니다.

프로세스가 완료되면 뷰 영역에 다양한 컬러의 큐브가 나타납니다. 컬러로 표시된 영역은 동일한 오클루전 데이터를 공유하는 지역입니다.

Clear 버튼을 클릭하면 오클루전 컬링을 위해 미리 계산한 데이터를 지울 수 있습니다.

오클루전 영역

움직이는 오브젝트에 오클루전 컬링을 적용하려면 Occlusion Area 를 만든 다음 움직이는 오브젝트가 포지션할 공간에 맞게 영역의 크기를 수정해야 합니다. 물론 움직이는 오브젝트를 정적이라고 표시할 수 없습니다. 빈 게임 오브젝트에 Occlusion Area 컴포넌트를 추가하여 오클루전 영역을 만들 수 있습니다(메뉴의 Component -> Rendering -> Occlusion Area).

Occlusion Area 를 만든 후 Is View Volume 체크박스를 선택하여 움직이는 오브젝트를 가려야 합니다.

프로퍼티: 기능:
Size 오클루전 영역의 크기를 정의합니다.
Center 오클루전 영역의 중심을 설정합니다. 디폴트는 0,0,0 이며 박스의 중앙에 위치합니다.
Is View Volume 카메라가 있을 수 있는 포지션을 정의합니다. 이 Occlusion Area 안에 있는 정적 오브젝트를 가리려면 이 항목을 선택해야 합니다.
움직이는 오브젝트에 대한 오클루전 영역 프로퍼티
움직이는 오브젝트에 대한 오클루전 영역 프로퍼티

오클루전 영역을 추가한 후 이 영역이 어떻게 상자를 셀로 분할하는지 확인해야 합니다. 오클루전 영역이 어떻게 산출되는지 확인하려면 Edit 을 선택하고 Occlusion Culling Preview Panel 에서 View 버튼을 토글해야 합니다.

생성된 오클루전 테스트

오클루전이 설정된 후 Visualize 모드일 때 Occlusion Culling Preview Panel 에서 Occlusion Culling 을 활성화하고 Main Camera 를 씬 뷰 안에서 여기저기 움직이면서 테스트할 수 있습니다.

씬 뷰의 오클루전 뷰 모드
씬 뷰의 오클루전 뷰 모드

메인 카메라를 여기저기 움직이면 (재생 모드인지 여부와 관계없이) 여러 오브젝트가 자동으로 비활성화되는 것이 보입니다. 이때 오클루전 데이터에 오류가 있는지 확인해야 합니다. 카메라를 움직일 때 오브젝트가 뷰에 갑자기 나타나면 오류가 있음을 알 수 있습니다. 이 경우 해상도를 변경하거나(타겟 영역을 사용하는 경우) 오브젝트를 움직여서 오류를 가려 오류를 수정할 수 있습니다. 오클루전 관련 문제를 디버깅하려면 메인 카메라를 문제가 있는 포지션으로 이동하여 무작위로 점검할 수 있습니다.

처리가 완료되면 뷰 영역에 다채로운 큐브가 몇 개 보일 것입니다. 파란색 큐브는 Target Volumes 의 셀 분할을 나타냅니다. 흰색 큐브는 View Volumes 의 셀 분할을 나타냅니다. 파라미터가 올바르게 설정된 경우 렌더링되지 않는 오브젝트가 몇 개 보일 것입니다. 그 이유는 오브젝트가 카메라의 뷰 절두체 밖에 있거나 다른 오브젝트에서 오클루드 처리되지 않기 때문일 것입니다.

오클루전이 완료된 후 씬에 오클루드 처리되는 것이 보이지 않으면 오브젝트가 셀 안에 완전히 들어갈 수 있도록 오브젝트를 더 작은 조각으로 나눠 보아야 합니다.

크거나 작은 느낌의 인상 만들기
머티리얼, 셰이더 및 텍스처(Materials, Shaders & Textures)