삼차원 게임 월드가 거대해지고 건물이나 지형지물 같은 구조물이 많아질수록, 카메라의 시야각 안에 들어오더라도 다른 큰 물체에 완전히 가려져 플레이어의 눈에 보이지 않는 오브젝트들이 대거 존재하게 됩니다. 프러스텀 컬링만으로는 이러한 내부 가려짐 현상을 해결할 수 없으며, 가려진 객체들까지 렌더링 파이프라인에 포함되면 심각한 드로우 콜 및 필레이트 낭비로 이어집니다.
이러한 문제를 해결하기 위해 도입된 핵심 최적화 기술이 바로 오클루전 컬링입니다. 이 글에서는 오클루전 컬링의 작동 메커니즘과 포털 기반 및 PVS 방식의 적용 구조를 소스 코드와 함께 상세히 분석해 보겠습니다.
1. 오클루전 컬링의 개념과 필요성
오클루전 컬링은 다른 불투명 오브젝트에 완전히 가려져 보이지 않는 오브젝트를 렌더링 대상에서 원천적으로 제외하는 기법입니다. 앞서 다룬 Z-테스트나 얼리 Z-테스트가 픽셀 단위로 가려진 픽셀을 걸러낸다면, 오클루전 컬링은 아예 오브젝트 단위로 드로우 콜 자체를 발생시키지 않도록 사전에 차단합니다.
대규모 도시나 실내 복도, 던전 형태의 게임 환경에서는 카메라 시야 내에 있더라도 화면의 상당 부분이 다른 벽이나 장애물에 가려지는 경우가 많습니다. 이때 오클루전 컬링을 적용하면 CPU와 GPU의 부하를 극적으로 줄일 수 있습니다.
2. PVS와 포털 컬링 방식
게임 엔진에서 오클루전 컬링을 구현할 때 주로 사용되는 대표적인 두 가지 접근 방식이 존재합니다.
첫째, 유니티 등에서 보편적으로 사용하는 잠재적 가시성 세트(PVS) 방식입니다. 맵 전체를 작은 셀 단위로 격자 분할하고, 각 셀에서 카메라가 위치했을 때 바라볼 수 있는 오브젝트들의 목록을 오프라인 베이킹 과정을 통해 미리 계산합니다. 런타임에는 현재 카메라가 속한 셀의 PVS 데이터셋을 참조하여 가시 여부를 즉시 판정합니다.
둘째, 실내 건축물이나 방 구조가 밀집한 환경에서 유리한 포털 컬링 방식입니다. 방과 방 사이의 문이나 창문 같은 포털 영역을 기준으로, 포털을 통과하는 시야의 가시 원추 내에 있는 오브젝트만 렌더링 대상으로 선정합니다.
C# 기반의 간단한 가시성 판정 및 컬링 관리 시뮬레이션
C#
// 유니티 C# 환경에서의 수동 오클루전 가시성 체크 관리 예시
public class OcclusionManager : MonoBehaviour {
public Transform playerCamera;
public Renderer[] targetRenderers;
private Plane[] cameraFrustumPlanes;
void Update() {
// 카메라의 프러스텀 평면 추출
cameraFrustumPlanes = GeometryUtility.CalculateFrustumPlanes(playerCamera.GetComponent<Camera>());
foreach (Renderer rend in targetRenderers) {
// 1차 프러스텀 컬링 검사
bool inFrustum = GeometryUtility.TestPlanesAABB(cameraFrustumPlanes, rend.bounds);
if (inFrustum) {
// 2차 오클루전 상태 체크 (가려짐 여부 판정)
bool isOccluded = CheckOcclusionRaycast(rend.bounds.center);
// 가려지지 않은 경우에만 렌더러 활성화
rend.enabled = !isOccluded;
} else {
rend.enabled = false;
}
}
}
bool CheckOcclusionRaycast(Vector3 targetCenter) {
RaycastHit hit;
Vector3 dir = targetCenter - playerCamera.position;
if (Physics.Raycast(playerCamera.position, dir.normalized, out hit, dir.magnitude)) {
// 중간에 장애물이 존재하고 대상 오브젝트가 아니라면 가려진 것으로 판정
if (hit.collider.gameObject != gameObject) {
return true;
}
}
return false;
}
}
- 장점: 렌더링해야 할 폴리곤 수와 드로우 콜을 획기적으로 줄여 프레임 레이트 방어에 탁월함.
- 단점: 복잡한 맵 구조에서는 사전 베이킹 시간이 오래 걸리며, 동적으로 생성되거나 움직이는 오브젝트의 경우 실시간 연산 비용이 커져 처리가 까다로움.
3. 정적 오클루더와 동적 오브젝트의 한계
오클루전 컬링은 기본적으로 벽이나 지형처럼 움직이지 않는 정적 오브젝트가 가리는 물체 역할을 수행할 때 가장 효율적으로 작동합니다.
만약 플레이어나 적 캐릭터처럼 수시로 움직이는 동적 오브젝트가 오클루더가 되거나 대상이 될 경우, 매 프레임마다 바운딩 박스의 위치가 바뀌므로 컬링 데이터를 동적으로 갱신해야 합니다. 이로 인해 CPU에 큰 부담이 가중될 수 있어, 대규모 오픈월드에서는 거리별 컬링이나 레이어 기반 필터링을 혼용하는 전략이 필요합니다.
요약 및 결론
오클루전 컬링은 보이지 않는 오브젝트의 렌더링 요청을 사전에 차단하여 GPU와 CPU의 병목을 근본적으로 해소하는 필수적인 최적화 기법입니다.
정적 구조물 중심의 베이킹 기반 PVS 관리와 포털 컬링 기법을 적절히 조합하고, 동적 오브젝트와의 연산 균형을 유지함으로써 복잡하고 광활한 3D 게임 환경에서도 높은 프레임 안정성과 최적의 성능을 확보할 수 있습니다.