← 블로그 목록

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

3D 장면이 무거울 때는 폴리곤 수를 줄이는 것 못지않게 보이지 않는 것을 일찍 걸러내는 일이 중요하다. 백페이스, 프러스텀, 오클루전 컬링은 비슷해 보여도 해결하는 문제가 서로 다르고 비용 구조도 다르다. 안 보이는 이유가 방향 때문인지, 시야 밖이기 때문인지, 가려졌기 때문인지 구분해서 적용해야 한다는 점을 OpenGL과 Unity 문서를 함께 정리한다.

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

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

3D 장면이 무거워질 때 가장 먼저 떠오르는 해결책은 보통 폴리곤 수를 줄이자는 말이다. 물론 중요하다. 하지만 실시간 렌더링에서는 그 못지않게 애초에 보이지 않는 것을 얼마나 일찍 걸러 내느냐가 중요하다. 이때 쓰는 기본 개념이 컬링이다.

컬링은 쉽게 말해 지금 프레임에서 그릴 필요가 없는 대상을 미리 제외하는 것이다. 모든 것을 끝까지 계산한 뒤 화면에 안 보였다고 판정하는 것보다, 앞단에서 빠르게 제외하는 편이 훨씬 낫기 때문이다.

백페이스 컬링은 닫힌 표면의 뒷면을 그리지 않는 기본 최적화다

가장 기초적인 것은 백페이스 컬링(back-face culling)이다. Khronos의 OpenGL 위키는 face culling이 닫힌 표면의 보이지 않는 삼각형을 제거해, 더 비싼 래스터화와 프래그먼트 셰이더 단계 전에 연산을 줄인다고 설명한다.

이 방식은 기본적으로 카메라를 향하지 않는 면을 버린다. 상자나 벽처럼 닫힌 메시에 대해서는 보통 뒷면이 화면에 직접 보일 일이 적기 때문에 효과가 크다.

다만 항상 켜 두면 되는 만능 옵션은 아니다.

이런 경우에는 별도 처리가 필요하다. 즉 백페이스 컬링은 기본기이지만, 메시 전제가 맞을 때 가장 잘 작동한다.

프러스텀 컬링은 카메라 시야 바깥의 오브젝트를 제외한다

프러스텀 컬링(frustum culling)은 카메라가 실제로 볼 수 있는 시야체 밖의 오브젝트를 제외하는 방법이다. Unity는 이를 카메라의 보이는 영역 밖에 있는 오브젝트를 렌더링하지 않도록 막는 성능 최적화라고 설명한다. 시야체는 보통 근평면, 원평면, 좌우상하 네 평면을 합친 여섯 개 평면으로 생각한다.

핵심은 간단하다.

이 단계는 대부분의 엔진이 기본으로 해 준다. 그래서 컬링 입문에서는 직접 구현보다 프러스텀 컬링이 어떤 문제를 푸는가를 먼저 이해하는 편이 중요하다.

오클루전 컬링은 시야 안에 있어도 다른 물체에 가려진 것을 걸러 낸다

프러스텀 컬링만으로는 부족할 때가 있다. 카메라 시야체 안에 있더라도, 벽 뒤 방 안의 물체처럼 최종 화면에 전혀 보이지 않는 경우가 있기 때문이다. 오클루전 컬링(occlusion culling)은 바로 이 문제를 다룬다.

Unity 매뉴얼은 오클루전 컬링을 다른 게임 오브젝트에 완전히 가려져 보이지 않는 오브젝트에 대한 렌더링 계산을 막는 과정으로 설명한다. 같은 문서는 카메라가 기본적으로 프러스텀 컬링은 수행하지만, 오클루전 컬링이 없으면 시야 안에 있는 가려진 오브젝트에 CPU와 GPU 시간을 낭비할 수 있다고도 말한다.

예를 들면 이런 장면에서 유용하다.

반대로 넓게 탁 트인 필드에서는 효과가 제한적일 수 있다.

오클루전 컬링은 공짜가 아니라서, 항상 켜는 것이 답은 아니다

이 부분이 중요하다. Unity 문서는 내장 오클루전 컬링이 런타임 계산을 CPU에서 수행하고, 베이크된 데이터를 메모리에 올려야 하므로 상황에 따라 비용이 생길 수 있다고 설명한다. 특히 GPU 과부하가 원인인 프로젝트에는 도움이 될 수 있지만, CPU와 메모리 측면의 상쇄 비용도 함께 봐야 한다.

즉 컬링은 이렇게 나눠서 보는 편이 정확하다.

좋은 최적화는 이름이 화려한 기법을 많이 켜는 것이 아니라, 지금 병목이 무엇인지를 먼저 보고 맞는 컬링을 적용하는 것이다.

핵심 정리

컬링의 본질은 3D 장면 전체를 무식하게 다 그리지 않고, 보이지 않는 기하를 가능한 한 앞단에서 제외하는 데 있다. 백페이스 컬링은 메시의 뒷면을, 프러스텀 컬링은 카메라 시야 바깥 오브젝트를, 오클루전 컬링은 가려져서 실제로 보이지 않는 오브젝트를 다룬다.

셋은 비슷해 보여도 해결하는 문제가 다르다. 그래서 컬링을 공부할 때 중요한 것은 기법 이름을 외우는 것이 아니라, 지금 안 보이는 이유가 방향 때문인지, 시야 밖이기 때문인지, 다른 물체에 가려졌기 때문인지를 구분하는 일이다.

참고 자료

← 목록으로
Related

함께 읽으면 좋은 글

게임 개발설계최적화
몬스터 설계는 타입 데이터와 개체 상태를 분리할 때 훨씬 단단해진다

RPG 몬스터 설계의 첫 질문은 ‘이 정보가 모든 고블린에게 공통인가, 이 한 마리만의 상태인가’다. 플라이웨이트 패턴처럼 타입 데이터와 개체 상태를 분리하면 메모리 중복뿐 아니라 수정 범위까지 함께 좁아지고 데이터 의미도 선명해진다. 오브젝트 풀은 멋이 아니라 생성·해제 빈도가 실제 병목일 때만 얹는 최적화라는 점도 함께 정리한다.

게임 개발DirectXDirect3D
DirectX 9는 왜 당시 윈도우 게임 개발자들에게 큰 사건이었나

Microsoft가 DirectX 9.0에서 고급 셰이더 언어와 더 강한 그래픽 프로그래밍 기능을 밀어붙이면서, 윈도우 게임 개발의 기준이 한 단계 올라갔다.

게임 개발프로토타입스타크래프트
거친 초기 스타크래프트 화면이 보여 주는 건 완성도가 아니라 검증 순서다

유명 게임의 초기 화면이 투박해 보이는 이유는 실패의 증거가 아니라 질문의 흔적이다. 라미 이스마일이 구분한 프로토타입과 버티컬 슬라이스 개념과 와이어트의 워크래프트 회고를 빌려, 프로토타입은 완성도를 증명하는 단계가 아니라 무엇이 재미인지 먼저 검증하는 단계임을 정리한다. 초반 핵심은 빨리 멋져 보이는 일이 아니라 빨리 틀려 보는 일이다.