오클루전 컬링

편집 역사 토론
컴퓨터 그래픽스 게임 개발 마지막 수정: 2026-07-23 04:24:07

1. 개요[편집]

오클루전 컬링(occlusion culling)은 다른 불투명 물체 뒤에 완전히 가려져 최종 화면에 단 한 픽셀도 기여하지 못하는 기하를, 픽셀·깊이 판정 단계에 도달하기 전에 미리 골라내 그리기를 통째로 건너뛰는 최적화 기법이다. 벽 하나가 그 뒤의 방 전체를 가린다면, 깊이 버퍼가 나중에 그 픽셀들을 알아서 버려주긴 하지만 — 그 시점엔 이미 정점 변환·래스터화·(경우에 따라) 셰이딩 비용을 다 치른 뒤다. 오클루전 컬링은 그 낭비 자체를 없애자는 것이라, “안 보이는 걸 애초에 GPU에 보내지 않는다”가 슬로건이다.1

즉 오클루전 컬링은 깊이 버퍼의 픽셀 단위 뒷정리와 목적은 같지만, 훨씬 앞 단계에서 물체(또는 물체 묶음) 단위로 결정을 내려 파이프라인 전체의 일을 줄인다는 점이 다르다.

2. 다른 컬링과의 구분[편집]

컬링(culling)이라는 이름을 공유하는 형제들이 있어 헷갈리기 쉽다. 세 가지는 서로 배타적이지 않고, 실제 엔진은 셋을 순서대로 다 통과시킨다.

  • 프러스텀 컬링(view-frustum culling): 카메라의 시야 절두체(view volume) 바깥에 있는 물체를 버린다. “화면 밖이니 안 보인다”는 판정. 물체가 무엇 뒤에 있는지는 따지지 않는다.
  • 백페이스 컬링(backface culling): 한 물체 안에서 카메라를 등지고 있는 폴리곤을 버린다. 물체 내부의 국소 판정.
  • 오클루전 컬링: 시야 안에 있고 앞면을 보이는데도, 다른 물체에 가려 안 보이는 경우를 버린다. 물체 사이의 관계를 알아야 하므로 셋 중 가장 비싸고 어렵다.

정리하면 프러스텀 컬링은 “안 보이는 곳”, 백페이스 컬링은 “안 보이는 면”, 오클루전 컬링은 “가려진 물체”를 각각 담당한다.

3. 하드웨어 오클루전 쿼리[편집]

GPU에 직접 물어보는 방식. 진짜 메시 대신 그것을 감싸는 값싼 바운딩 프록시(bounding box 등)를 깊이 판정만 켠 채 그려보고, “이 프록시의 픽셀 중 몇 개가 깊이 테스트를 통과했나”를 GPU에 질의(occlusion query)한다. 통과 픽셀이 0이면 프록시가 완전히 가려졌다는 뜻이니 진짜 물체는 그리지 않는다. 문제는 지연이다. GPU에 물어보고 답을 받을 때까지 CPU가 기다리면 파이프라인이 멈추므로, 실무에서는 이번 프레임의 쿼리 결과를 다음 프레임의 그리기 결정에 쓰는 한 프레임 지연(one-frame latency) 방식을 택한다. 카메라가 홱 돌면 한 프레임 동안 가려졌다 판단해 빠뜨리거나 반대로 헛그리는 팝핑이 생길 수 있다.2

4. Hi-Z와 소프트웨어 오클루전 컬링[편집]

  • 계층적 Z-버퍼(Hierarchical Z-buffer, Hi-Z): 깊이 버퍼를 밉맵처럼 다단 축소해, 각 하위 레벨 셀에 그 영역의 가장 먼 깊이를 담아둔다. 물체의 바운딩 박스를 화면에 투영한 뒤 적당한 Hi-Z 레벨의 몇 셀만 비교하면, 픽셀 단위로 다 훑지 않고도 “이 박스는 전부 저 먼 깊이보다도 뒤”임을 단번에 판정해 통째로 버릴 수 있다.
  • 소프트웨어 오클루전 컬링: 큰 가림막(occluder) 몇 개를 CPU에서 저해상도 깊이 버퍼에 직접 래스터화한 뒤, 다른 물체의 바운딩 박스를 그 버퍼에 시험 투영해 가시성을 판정한다. GPU 왕복 지연이 없고 이번 프레임 안에서 결정을 끝낼 수 있어, 대규모 오픈월드 엔진들이 널리 채택해 왔다.3

5. PVS와 공간 자료구조[편집]

정적인 레벨이라면 아예 오프라인에 계산을 미룰 수 있다. 잠재 가시 집합(Potentially Visible Set, PVS)은 공간을 구역(예: BSP 리프)으로 나눠, 각 구역에서 잠재적으로 보일 수 있는 다른 구역 목록을 미리 계산해 저장해 두는 기법이다. 런타임에는 카메라가 속한 구역의 PVS만 그리면 되니 실시간 오클루전 판정 자체가 거의 사라진다. Quake 시절 실내 BSP 엔진의 국룰이었고, 지금도 정적 레벨의 밑바탕으로 쓰인다. 어느 방식이든 후보를 빠르게 추리려면 경계 볼륨 계층 같은 공간 자료구조로 물체를 계층적으로 묶어 두는 것이 전제다.

6. 트레이드오프[편집]

오클루전 컬링은 공짜가 아니다 — 판정 자체에 CPU/GPU 비용이 들고, 잘못 버리면 있어야 할 물체가 사라지는 치명적 결함이 된다. 그래서 대부분의 실용적 방식은 보수적(conservative)으로 설계된다. 즉 확실히 가려진 것만 버리고, 애매하면 그냥 그린다. 실내처럼 가림이 심한 장면에서는 극적인 이득을, 탁 트인 벌판처럼 가릴 게 없는 장면에서는 판정 비용만 남는 손해를 볼 수 있다. 결국 장면 특성에 맞춰 켜고 끄는 판단이 실시간 렌더링 최적화의 한 축이 된다.

회색 가림막(occluder) 패널이 서로 다른 깊이의 색색 물체 6개 앞을 지나간다. 어떤 물체가 화면상 가림막의 사각형 안에 들어오고 동시에 가림막보다 더 먼 깊이에 있으면, 완전히 가려진 것으로 보고 그리기를 건너뛰어 '컬링됨'으로, 그렇지 않으면 '그려짐'으로 집계한다. 화면 위치와 깊이를 함께 봐야 한다는 점이 프러스텀·백페이스 컬링과 다른 지점이다.

7. 관련 문서[편집]

8. Footnotes[편집]

  1. “안 보이는 걸 왜 그리냐”는 당연해 보이지만, 무엇이 가려졌는지 아는 것 자체가 그리는 것만큼 어렵다는 게 함정이다. 그래서 오클루전 컬링은 “그리기 전에 그려보는” 자기모순적인 작업을 값싼 프록시로 대신하는 기술의 총집합이 된다.

  2. 한 프레임 지연은 “지난 프레임의 가시성으로 이번 프레임을 도박하는” 구조라, 카메라가 급회전하면 잠깐 물체가 튀는 팝핑이 대가로 붙는다. 그래서 프록시를 살짝 부풀리거나 여러 프레임에 걸쳐 부드럽게 페이드하는 잔기술이 함께 쓰인다.

  3. 2000~2010년대 대형 오픈월드·FPS 엔진 발표들에서 소프트웨어 오클루전 및 미들웨어형 가시성 솔루션이 자주 소개되었다. 구체적 사명·제목까지 확신 없이 인용하진 않겠다 — 요점은 “CPU에서 저해상도 깊이 버퍼를 직접 굴려 GPU 왕복 지연을 없앤다”는 아이디어가 이 시기 널리 정착했다는 것.