Artoke

언리얼 기술: 공간 분할과 BVH

게임 속 물건 찾기 대작전: BVH 이야기

게임 화면 속에는 정말 많은 물건이 있어요. 나무, 돌, 자동차, 몬스터까지요. 그런데 게임은 매 순간 이런 질문에 답해야 해요. "총알이 어떤 물건에 맞았지?", "캐릭터가 벽에 부딪혔나?" 이 질문에 빨리 답하는 비법이 바로 오늘의 주인공, BVH예요. 우리말로 하면 경계 상자 나무 정도가 돼요.

1. 하나하나 다 물어보면 너무 느려요

친구가 잃어버린 지우개를 찾는다고 해 볼게요. 학교 전체를 뒤지면 어떨까요? 1반부터 6반까지, 모든 책상 서랍을 다 열어 봐야 해요. 너무 오래 걸리죠.

게임도 똑같아요. 물건이 10만 개 있는데, 총알 하나가 날아갈 때마다 10만 개를 전부 검사하면 게임이 뚝뚝 끊겨요. 그래서 똑똑한 방법이 필요해요.

2. 물건을 상자에 담아요

먼저 물건 하나하나를 상자에 담아요. 이 상자를 경계 상자라고 불러요. 모양이 복잡한 몬스터도 상자에 담으면 그냥 네모가 돼요.

왜 상자에 담을까요? 네모 상자는 검사하기 아주 쉽기 때문이에요. "총알이 이 네모 안에 들어왔나?"는 컴퓨터가 눈 깜짝할 사이에 답할 수 있어요. 복잡한 몬스터 모양을 바로 검사하는 것보다 훨씬 빨라요.

중요한 규칙이 하나 있어요. 상자는 물건을 완전히 감싸야 해요. 몬스터의 꼬리가 상자 밖으로 삐져나오면 안 돼요.

3. 상자를 또 큰 상자에 담아요

여기서 진짜 비법이 나와요. 작은 상자들을 모아서 더 큰 상자에 담는 거예요.

장난감 정리를 생각해 보세요. 로봇은 로봇 상자에, 블록은 블록 상자에 담아요. 그리고 그 상자들을 큰 옷장에 넣어요. 그러면 이런 층층 구조가 생겨요.

  • 맨 위: 모든 것을 담은 제일 큰 상자 (옷장)
  • 중간: 몇 개씩 묶은 중간 상자 (로봇 상자, 블록 상자)
  • 맨 아래: 물건 하나하나를 담은 작은 상자

이렇게 상자 속에 상자, 그 속에 또 상자가 들어 있는 모양이 마치 나뭇가지가 갈라지는 것 같아서 나무 구조라고 불러요. 이것이 바로 BVH예요.

네모 상자로 만든 경계 상자 나무의 예
An example of a bounding volume hierarchy using rectangles as bounding volumes · 출처: 공간 분할과 BVH

4. 그림으로 한눈에 보기

아래 그림을 보세요. 왼쪽은 게임 화면 속 물건들이고, 오른쪽은 그것을 나무 모양으로 그린 거예요.

언리얼 기술: 공간 분할과 BVH 도식

5. 이제 찾는 게 빨라져요

총알이 날아왔다고 해 볼게요. 컴퓨터는 이렇게 검사해요.

  1. 제일 큰 상자 A에 총알이 닿았나? 안 닿았으면 끝! 안에 있는 모든 물건은 검사할 필요도 없어요.
  2. 닿았다면, 그 안의 상자 B와 C를 검사해요.
  3. 상자 B에는 안 닿고 C에만 닿았다면? B 안의 공과 블록은 통째로 건너뛰어요.
  4. 이렇게 닿은 상자만 따라 내려가서, 마지막에 진짜 물건을 검사해요.

지우개 찾기로 다시 말하면 이래요. "3반에 있대!"라는 말을 들으면 1반, 2반은 아예 안 가도 되죠. 한 번 질문할 때마다 찾을 곳이 절반씩 훅훅 줄어들어요. 그래서 물건이 10만 개여도 검사는 몇십 번이면 끝나요.

컴퓨터가 빠르게 탐색하도록 한 줄로 펼쳐 놓은 BVH 나무
Visualization of a flattened BVH tree for efficient traversal [ 4 ] · 출처: 공간 분할과 BVH

6. 상자를 잘 나누는 것도 기술이에요

그런데 아무렇게나 묶으면 안 돼요. 상자 B와 상자 C가 서로 많이 겹치면 문제가 생겨요. 겹친 곳에 총알이 오면 B도 검사하고 C도 검사해야 하니까요. 두 번 일하는 셈이죠.

그래서 BVH를 만들 때는 상자들이 되도록 겹치지 않게, 물건들을 잘 나눠 담아요. 아래 그림처럼 나쁘게 나누면 겹치는 부분이 커지고, 잘 나누면 겹침이 거의 없어져요.

나쁘게 나누면 겹침이 크고 잘 나누면 겹침이 작다는 비교 그림
BVH splitting plane selection that possibly lead to big overlap region (upper diagram) compared to a better selection (lower diagram) · 출처: 공간 분할과 BVH

"어디서 나눌까?"를 정할 때는 여러 후보 자리를 정해 놓고, 어느 자리가 제일 좋은지 점수를 매겨서 골라요. 마치 케이크를 자르기 전에 "여기? 아니면 여기?" 하고 몇 군데를 비교해 보는 것과 같아요.

여러 나누기 후보 자리를 칸으로 나누어 비교하는 그림
BVH construction with buckets of splitting planes for fast SAH criteria check · 출처: 공간 분할과 BVH

7. 언리얼 엔진에서는 어디에 쓰일까요?

언리얼 엔진 같은 게임 엔진은 BVH를 아주 많이 써요.

  • 충돌 검사: 캐릭터가 벽에 부딪히는지, 총알이 적에게 맞는지 빠르게 알아내요.
  • 레이 트레이싱: 빛줄기가 어떤 물건에 닿는지 계산해서 진짜 같은 그림자와 반사를 만들어요. 빛줄기 수백만 개를 매 순간 검사해야 해서 BVH가 없으면 불가능해요.

여러분이 게임에서 부드러운 그래픽과 정확한 충돌을 즐길 수 있는 건, 보이지 않는 곳에서 이 상자 나무가 열심히 일하고 있기 때문이에요.

8. 오늘 배운 것 정리

  • 물건을 하나하나 다 검사하면 너무 느려요.
  • 물건을 경계 상자에 담고, 상자를 또 큰 상자에 담아 나무 구조를 만들어요. 이게 BVH예요.
  • 큰 상자에 안 닿으면 그 안은 통째로 건너뛰어요. 그래서 엄청나게 빨라져요.
  • 상자끼리 겹침이 적도록 잘 나누는 것이 중요해요.
  • 게임의 충돌 검사와 레이 트레이싱이 모두 BVH 덕분에 빨라요.

다음에 게임을 할 때 총알이 딱 맞는 순간, 마음속으로 이렇게 말해 보세요. "지금 상자 나무가 일하고 있구나!"

출처

광고

리깅 파이프라인 자동화 도구

반복 작업은 스크립트에게. 현업에서 쓰는 리깅 툴 모음.

리깅 도구 보기