백페이스 컬링

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

1. 개요[편집]

백페이스 컬링(backface culling)은 닫힌 불투명 물체(closed, solid manifold)에서 카메라를 등지고 있는 폴리곤 — 즉 뒷면(back face) — 을 래스터화·셰이딩 전에 골라내 버리는 고전적인 래스터화 파이프라인 최적화다. 논리는 단순하다. 물체가 속이 꽉 찬 닫힌 표면이라면, 카메라 반대편을 향한 면은 반드시 그 물체의 앞면에 가려져 절대 보이지 않는다. 어차피 안 보일 면이니 정점 처리 이후 단계에 넘기지 않고 즉시 잘라내면, 평균적으로 폴리곤의 절반 가까이를 공짜로 줄일 수 있다.1

핵심 조건은 “닫힌 다양체(manifold)“라는 가정이다. 뚜껑 없는 그릇이나 한 겹짜리 종이처럼 뒷면이 실제로 보일 수 있는 형상에서는 이 가정이 깨지므로 함부로 켜면 안 된다. 그래서 백페이스 컬링은 보수적이지 않은(형상 가정에 의존하는) 최적화로 분류된다.

2. 두 가지 판정 방법[편집]

뒷면을 가려내는 계산은 수학적으로 두 가지 동등한 형태로 쓸 수 있다.

2.1. 화면 공간 감김 순서 판정[편집]

폴리곤 정점을 화면에 투영한 뒤, 그 정점들이 시계 방향(CW)으로 감기는지 반시계 방향(CCW)으로 감기는지로 앞뒤를 가른다. 감김 방향은 투영된 삼각형의 부호 있는 넓이(signed area)로 판정하는데, 신발끈 공식(shoelace formula)으로

A=12i=0n1(xiyi+1xi+1yi)A = \tfrac{1}{2}\sum_{i=0}^{n-1}\left(x_i\, y_{i+1} - x_{i+1}\, y_i\right)

을 계산해 부호만 보면 된다. 부호가 약속한 앞면 방향(예: CCW를 앞면)과 반대면 뒷면으로 판정해 버린다. GPU 고정 기능 파이프라인이 실제로 쓰는 방식이 이것으로, 투영 후 딱 곱셈 몇 번이면 끝나 매우 싸다.

2.2. 물체·카메라 공간 법선 판정[편집]

각 면의 법선 벡터 n\mathbf{n}과, 그 면에서 카메라로 향하는 시선 벡터 v\mathbf{v}의 내적 부호로 판정한다.

nv>0    앞면,nv0    뒷면\mathbf{n}\cdot\mathbf{v} > 0 \;\Rightarrow\; \text{앞면}, \qquad \mathbf{n}\cdot\mathbf{v} \le 0 \;\Rightarrow\; \text{뒷면}

법선이 카메라 쪽을 향하면(내적 양수) 앞면, 등지면(내적 음수) 뒷면이다. 원근 투영에서는 면마다 시선 방향이 달라 각 면 위치에서 카메라로의 벡터를 써야 정확하다. 두 방법은 수학적으로 같은 판정을 다른 좌표계에서 하는 것이며, 감김 순서 판정이 투영의 부호로 이 내적의 부호를 간접적으로 읽어내는 셈이다.2

3. GPU 고정 기능 컬 모드[편집]

현대 GPU는 이 판정을 고정 기능으로 제공하며, 렌더 상태로 모드를 고른다.

  • cull-back: 뒷면을 버린다. 대부분의 불투명 닫힌 메시의 기본값.
  • cull-front: 앞면을 버린다. 그림자 볼륨, 일부 특수 셰이딩 트릭에서 뒷면만 쓰고 싶을 때.
  • cull-none: 아무것도 안 버린다. 나뭇잎·천·종이처럼 얇은 양면(double-sided) 지오메트리나, 닫히지 않은 비다양체 메시처럼 컬링이 틀린 결과를 낳는 경우에 필수다.3

감김 방향의 “앞면” 정의(front-face winding)도 상태로 지정할 수 있어, 모델링 툴의 컨벤션에 맞춰 CW/CCW를 뒤집을 수 있다. 정점 순서가 뒤집힌 메시를 임포트하면 앞뒤가 통째로 반대로 컬링되어 물체 안쪽이 보이는 유명한 버그가 여기서 나온다.

4. 오클루전 컬링과의 구분[편집]

백페이스 컬링은 한 물체 안의 국소·기하 판정이다. 면 하나의 방향만 보면 되고 다른 물체를 전혀 참조하지 않으며, 닫힌 형상 가정 아래에서 항상 옳은 보수적 컷이다. 반면 오클루전 컬링은 어떤 물체가 다른 물체 뒤에 가려졌는지를 따지는 물체 사이의 판정이라, 무엇이 무엇 앞에 있는지 장면 전체의 깊이 관계를 알아야 한다. 실제 파이프라인에서는 프러스텀 컬링으로 시야 밖을 걷어내고, 물체 단위 오클루전 컬링으로 가려진 것을 추리고, 남은 물체의 폴리곤에 백페이스 컬링을 적용하는 식으로 세 단계가 함께 작동한다. 그렇게 살아남은 면들만 깊이 버퍼 판정을 거쳐 최종 픽셀이 된다.

5. 한계와 주의[편집]

닫힌 다양체 가정에 전적으로 기대는 최적화라, 형상이 그 가정을 어기면 조용히 틀린 그림을 낸다. 뚫린 면, 반전된 법선, 한 겹 천, 유리 같은 반투명체가 대표적 예외다. 반투명 물체는 뒷면도 비쳐 보여야 하므로 컬링을 끄거나 뒷면·앞면을 순서대로 두 번 그리는 처리를 따로 해야 한다. 그럼에도 불구하고 불투명 솔리드가 장면의 대부분인 실시간 렌더링에서 백페이스 컬링은 켜두는 것이 국룰이고, 폴리곤 절반을 거의 공짜로 날려 주는 가성비 덕에 실시간 렌더링 파이프라인의 표준 상비 옵션으로 자리 잡았다.

회전하는 정육면체에서 각 면의 법선과 시선 벡터의 내적 부호로 앞뒤를 가른다. 앞면(내적 양수) 쿼드는 채움+외곽선으로, 뒷면(내적 음수) 쿼드는 무엇이 컬링되는지 보이도록 흐린 점선 외곽선으로만 그린다. 하단의 '앞면 렌더 N · 뒷면 컬링 M' 카운트가 회전에 따라 실시간으로 바뀐다 — 실제 GPU가 켜면 점선 뒷면들은 아예 그려지지 않는다.

6. 관련 문서[편집]

7. Footnotes[편집]

  1. “절반을 공짜로 버린다”는 표현이 과장이 아니다. 볼록한 닫힌 물체를 임의 방향에서 보면 면의 대략 절반이 뒷면이라, 통계적으로 폴리곤 처리량이 반토막 난다. 정점 셰이더까지는 이미 돌린 뒤에 자르는 구현이 많아 정점 비용은 덜 줄지만, 값비싼 픽셀 셰이딩을 통째로 아끼는 것만으로도 남는 장사다.

  2. 그래서 실무 GPU는 굳이 법선을 저장·전달하지 않고 화면 감김 순서만으로 컬링한다. 법선 판정은 개념적으로 명쾌하지만, 감김 순서 판정은 어차피 투영된 좌표만 있으면 되니 데이터도 계산도 더 싸다. 같은 진실을 더 게으르게 읽는 쪽을 택한 셈.

  3. cull-none을 깜빡하고 나뭇잎을 그리면 잎의 뒷면이 사라져 숲이 듬성듬성해진다. 반대로 닫힌 메시에 cull-none을 켜두면 안 보일 뒷면까지 죽어라 셰이딩하며 성능만 갉아먹는다. 형상에 맞는 컬 모드를 고르는 건 예술이 아니라 기본기다.