On this page
article
Culling
Occlusion Culling과 Visibility Culling
게임 엔진은 매 프레임 화면에 보이는 오브젝트만 렌더링해야 한다.
그렇지 않으면 GPU는 사용자에게 보이지 않는 수많은 오브젝트까지 렌더링하게 되어 성능이 급격히 저하된다.
Unreal Engine은 이를 방지하기 위해 Occlusion Culling과 Visibility Culling이라는 두 가지 기법을 사용한다.
Occlusion Culling이란
Occlusion Culling은 카메라 기준으로 다른 오브젝트에 가려져서 화면에 보이지 않는 오브젝트를 렌더링 대상에서 제외하는 기술이다.
핵심 원리
- Z-Buffer (Depth Buffer)를 활용
- GPU 또는 CPU에서 Occlusion Query를 실행하여 가시성 판단
- 보이더라도 완전히 가려져 있다면 Cull 처리
예시
- 벽 뒤에 있는 캐릭터 → Occlusion 처리되어 렌더링 생략
- 지형 뒤에 완전히 숨어 있는 구조물 → 그리기 생략
Visibility Culling이란
Visibility Culling은 카메라 시야(Frustum) 바깥에 있는 오브젝트를 렌더링하지 않는 방식이다.
핵심 원리
- 카메라의 뷰 프러스텀(FOV 범위)과 AABB(Box Bounds) 간 교차 여부를 계산
- 엔진이 매 프레임 마다 위치를 검사하여 View Frustum 외부인 경우 Cull 처리
예시
- 뒤를 보고 있는 카메라에 앞쪽 건물은 프러스텀 밖 → Cull 처리됨
- 카메라 화면에 안 잡히는 측면 배경 → 생략됨
두 기법의 차이점
항목 | Occlusion Culling | Visibility Culling |
---|---|---|
기준 | 가려진 오브젝트 제거 | 시야(FOV) 밖 오브젝트 제거 |
연산 위치 | GPU 또는 CPU Query | CPU 기반 Bounding Box 계산 |
장점 | 보이지 않는 요소까지 완전히 제거 가능 | 비교적 계산이 가벼움 |
단점 | GPU 연산 또는 Occlusion Query 지연 가능성 | 복잡한 시야 예외 처리 불가 |
Unreal Engine에서의 적용 방법
Occlusion Culling 설정
Actor
또는StaticMeshComponent
단위로 설정 가능
MyComponent->SetOcclusionEnabled(true);
- 또는 에디터에서
Rendering → Can Be Occluded
옵션 활성화
Visibility Culling 자동 적용
Unreal Engine은 기본적으로 모든 렌더러에 Visibility Culling이 적용되어 있다.
별도 설정 없이 모든 카메라는 View Frustum 기반으로 자동 Cull 처리를 수행한다.
성능 디버깅 및 시각화
Occlusion View 확인
콘솔 명령어:
r.VisualizeOccludedPrimitives 1
→ 화면에 Occlusion Culling된 오브젝트가 초록색 박스로 표시됨
Stat 명령어로 Culling 성능 확인
stat InitViews
→ Occlusion, Visibility, Shadow Culling 등의 시간 확인 가능
실전 팁
- 지형이나 대형 건물은 Occluder 역할을 하도록
bUseAsOccluder = true
설정 - 카메라와 가까운 곳에 **Occluder Mesh (전용 박스)**를 배치하면 효과적임
- 작은 오브젝트는 Occlusion Query를 매번 하는 것보다 그냥 렌더링하는 게 나을 수 있음 (오히려 오버헤드 발생 가능)
- LOD 및 Cull Distance와 병행 설정하면 더 큰 최적화 효과 가능
Cull Distance Volume과의 조합
Cull Distance Volume
을 사용하면 거리 기반으로 렌더링 여부를 제어할 수 있다.
Occlusion/Visibility Culling 외에 거리 기반까지 포함하면 다중 단계 최적화가 가능하다.
요약
항목 | 설명 |
---|---|
Occlusion Culling | 가려진 오브젝트는 렌더링 생략 |
Visibility Culling | 시야 밖 오브젝트는 렌더링 생략 |
설정 방법 | SetOcclusionEnabled() , CanBeOccluded , 자동 Frustum 검사 |
디버깅 도구 | r.VisualizeOccludedPrimitives , stat InitViews 등 |
추천 조합 | LOD + Cull Distance + Occlusion 병행 시 최대 효과 |