컬링은 안 보이는 것을 덜 그려서 3D 장면을 버티게 만드는 기본 최적화다

3D 장면이 무거워질 때 가장 먼저 떠오르는 해결책은 보통 폴리곤 수를 줄이자는 말이다. 물론 중요하다. 하지만 실시간 렌더링에서는 그 못지않게 애초에 보이지 않는 것을 얼마나 일찍 걸러 내느냐가 중요하다. 이때 쓰는 기본 개념이 컬링이다.
컬링은 쉽게 말해 지금 프레임에서 그릴 필요가 없는 대상을 미리 제외하는 것이다. 모든 것을 끝까지 계산한 뒤 화면에 안 보였다고 판정하는 것보다, 앞단에서 빠르게 제외하는 편이 훨씬 낫기 때문이다.
백페이스 컬링은 닫힌 표면의 뒷면을 그리지 않는 기본 최적화다
가장 기초적인 것은 백페이스 컬링(back-face culling)이다. Khronos의 OpenGL 위키는 face culling이 닫힌 표면의 보이지 않는 삼각형을 제거해, 더 비싼 래스터화와 프래그먼트 셰이더 단계 전에 연산을 줄인다고 설명한다.
이 방식은 기본적으로 카메라를 향하지 않는 면을 버린다. 상자나 벽처럼 닫힌 메시에 대해서는 보통 뒷면이 화면에 직접 보일 일이 적기 때문에 효과가 크다.
다만 항상 켜 두면 되는 만능 옵션은 아니다.
- 양면이 보여야 하는 얇은 천이나 잎사귀 셰이더
- 면 방향이 뒤섞인 잘못된 메시
- 투명 재질처럼 양면 처리가 필요한 경우
이런 경우에는 별도 처리가 필요하다. 즉 백페이스 컬링은 기본기이지만, 메시 전제가 맞을 때 가장 잘 작동한다.
프러스텀 컬링은 카메라 시야 바깥의 오브젝트를 제외한다
프러스텀 컬링(frustum culling)은 카메라가 실제로 볼 수 있는 시야체 밖의 오브젝트를 제외하는 방법이다. Unity는 이를 카메라의 보이는 영역 밖에 있는 오브젝트를 렌더링하지 않도록 막는 성능 최적화라고 설명한다. 시야체는 보통 근평면, 원평면, 좌우상하 네 평면을 합친 여섯 개 평면으로 생각한다.
핵심은 간단하다.
- 화면 바깥에 완전히 있는 오브젝트는 그릴 필요가 없다.
- 따라서 매 프레임 카메라 시야와 오브젝트의 경계 볼륨을 비교한다.
이 단계는 대부분의 엔진이 기본으로 해 준다. 그래서 컬링 입문에서는 직접 구현보다 프러스텀 컬링이 어떤 문제를 푸는가를 먼저 이해하는 편이 중요하다.
오클루전 컬링은 시야 안에 있어도 다른 물체에 가려진 것을 걸러 낸다
프러스텀 컬링만으로는 부족할 때가 있다. 카메라 시야체 안에 있더라도, 벽 뒤 방 안의 물체처럼 최종 화면에 전혀 보이지 않는 경우가 있기 때문이다. 오클루전 컬링(occlusion culling)은 바로 이 문제를 다룬다.
Unity 매뉴얼은 오클루전 컬링을 다른 게임 오브젝트에 완전히 가려져 보이지 않는 오브젝트에 대한 렌더링 계산을 막는 과정으로 설명한다. 같은 문서는 카메라가 기본적으로 프러스텀 컬링은 수행하지만, 오클루전 컬링이 없으면 시야 안에 있는 가려진 오브젝트에 CPU와 GPU 시간을 낭비할 수 있다고도 말한다.
예를 들면 이런 장면에서 유용하다.
- 복도와 방이 많은 실내 맵
- 큰 구조물이 시야를 자주 가르는 도시 장면
- 가려짐이 분명한 건축 시각화
반대로 넓게 탁 트인 필드에서는 효과가 제한적일 수 있다.
오클루전 컬링은 공짜가 아니라서, 항상 켜는 것이 답은 아니다
이 부분이 중요하다. Unity 문서는 내장 오클루전 컬링이 런타임 계산을 CPU에서 수행하고, 베이크된 데이터를 메모리에 올려야 하므로 상황에 따라 비용이 생길 수 있다고 설명한다. 특히 GPU 과부하가 원인인 프로젝트에는 도움이 될 수 있지만, CPU와 메모리 측면의 상쇄 비용도 함께 봐야 한다.
즉 컬링은 이렇게 나눠서 보는 편이 정확하다.
- 백페이스 컬링: 거의 기본기
- 프러스텀 컬링: 엔진 차원에서 흔히 기본 제공
- 오클루전 컬링: 장면 특성과 병목에 따라 이득이 갈리는 선택지
좋은 최적화는 이름이 화려한 기법을 많이 켜는 것이 아니라, 지금 병목이 무엇인지를 먼저 보고 맞는 컬링을 적용하는 것이다.
핵심 정리
컬링의 본질은 3D 장면 전체를 무식하게 다 그리지 않고, 보이지 않는 기하를 가능한 한 앞단에서 제외하는 데 있다. 백페이스 컬링은 메시의 뒷면을, 프러스텀 컬링은 카메라 시야 바깥 오브젝트를, 오클루전 컬링은 가려져서 실제로 보이지 않는 오브젝트를 다룬다.
셋은 비슷해 보여도 해결하는 문제가 다르다. 그래서 컬링을 공부할 때 중요한 것은 기법 이름을 외우는 것이 아니라, 지금 안 보이는 이유가 방향 때문인지, 시야 밖이기 때문인지, 다른 물체에 가려졌기 때문인지를 구분하는 일이다.