Occlusion Culling과 Visibility Culling

게임 엔진은 매 프레임 화면에 보이는 오브젝트만 렌더링해야 한다.
그렇지 않으면 GPU는 사용자에게 보이지 않는 수많은 오브젝트까지 렌더링하게 되어 성능이 급격히 저하된다.
Unreal Engine은 이를 방지하기 위해 Occlusion CullingVisibility 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 CullingVisibility Culling
기준가려진 오브젝트 제거시야(FOV) 밖 오브젝트 제거
연산 위치GPU 또는 CPU QueryCPU 기반 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 병행 시 최대 효과