상세 컨텐츠

본문 제목

ALEngine: Frustum Culling 구현 - (1)

Computer Graphics/ALEngine

by Banjosh 2025. 2. 17. 20:44

본문

Frustum Culling이란?

Frustum Culling은 카메라의 시야 범위(Frustum) 밖에 있는 객체들을 렌더링하지 않아 성능을 최적화하는 기술이다. 시야에 보이지 않는 객체들을 제외함으로써 불필요한 GPU 연산을 줄여 성능을 크게 향상시킬 수 있다.


내가 구현한 Frustum Culling

1.  BVH 사용

Bounding Volume을 구 형태로 구성하여 BVH(Bounding Volume Hierarchy)를 구축했다. 모든 오브젝트는 BVH의 노드로 관리되며, Culling은 다음 세 가지 경우로 처리된다:

  • 1. 현재 노드가 카메라 영역 밖에 있는 경우
    현재 노드를 포함한 모든 자식 노드를 렌더링하지 않는다.
  • 2. 현재 노드가 카메라 영역 내부에 있는 경우
    현재 노드와 모든 자식 노드를 렌더링한다.
  • 3. 현재 노드가 카메라 영역에 걸쳐 있는 경우
    리프(Leaf) 노드라면 해당 노드를 렌더링하며, 자식 노드가 있는 경우에는 자식 노드 각각에 대해 Culling 여부를 따로 판단한다.

2. 카메라별 Frustum 영역 생성

렌더링할 카메라 기준으로 Frustum 영역을 생성한다. 렌더링 직전에 카메라의 위치와 방향을 기반으로 Frustum을 계산하고, Culling을 수행한 후에 렌더링을 진행한다.


3. Scene별 BVH 생성

Scene 단위로 BVH를 생성해 해당 Scene의 오브젝트들을 관리힌다. Scene별 BVH는 오브젝트가 움직이는 경우 갱신되며, 이를 통해 동적 오브젝트도 처리가 가능하다.


 

Frustum culling 구현 전

 

RenderDoc으로 FPS를 측정하면서 렌더링 한 결과 Frustum culling 구현 전엔 화면에 오브젝트가 몇 개 등장하든 1100 ~ 1200의 FPS가 유지되었다.

 

Frustum culling 구현 후

 

Frustum culling 구현 후 오브젝트가 화면에 나오면 FPS가 1200, 오브젝트가 화면에 나오지 않으면 FPS가 2000까지 올라가는 것을 볼 수 있다.

 

이번 글에서는 간단히 Frustum culling의 최적화 효과에 대해 살펴보았다. 

다음 글에서는 물리 엔진의 position, rotation freeze 구현에 대해 알아볼 것이다.

 

관련글 더보기