안 보이는 건 그리지 않아요! — 컬링과 오클루전 이야기
안 보이는 건 그리지 않아요! — 컬링과 오클루전 이야기
게임 화면은 마법처럼 뚝딱 나오는 게 아니에요. 컴퓨터가 1초에 수십 번씩 그림을 그려서 보여 주는 거예요. 그런데 컴퓨터에게도 그림 그리기는 힘든 일이에요. 그래서 컴퓨터는 아주 영리한 꾀를 하나 부려요. 바로 "안 보이는 건 아예 그리지 않기"예요. 오늘은 이 꾀의 이름인 컬링(Culling)과 오클루전(Occlusion)을 차근차근 알아볼게요.
1. 숨은 그림을 찾아라? 아니, 숨은 그림은 버려라!
친구와 숨바꼭질을 한다고 생각해 보세요. 친구가 커다란 나무 뒤에 숨었어요. 그럼 여러분 눈에는 친구가 안 보이죠? 나무가 친구를 가렸으니까요.
3D 게임 세상도 똑같아요. 벽 뒤에 있는 방, 산 너머에 있는 마을, 상자 안에 든 보물. 이런 것들은 지금 화면에서 보이지 않아요. 그런데 컴퓨터가 이걸 전부 그린다면 어떻게 될까요? 보이지도 않는 그림을 그리느라 힘만 빼고, 게임은 느려지고 뚝뚝 끊기게 돼요.
그래서 컴퓨터 그래픽에는 아주 오래된 숙제가 있었어요. 바로 "지금 카메라에서 뭐가 보이고, 뭐가 안 보이는지 알아내기"예요. 이 숙제를 어려운 말로 은면 제거 또는 가시성 문제라고 불러요. 이름은 어렵지만 뜻은 간단해요. "가려진 면은 치워 버리자!"라는 뜻이에요.
2. 컬링 = 골라서 버리기
컬링(Culling)은 영어로 "골라내서 버린다"는 뜻이에요. 농부 아저씨가 사과 상자에서 상한 사과를 골라 버리는 것처럼, 컴퓨터도 그릴 필요가 없는 물체를 골라서 그리기 목록에서 빼 버려요.
버리는 방법에는 여러 가지가 있어요. 하나씩 볼까요?
① 시야 밖 버리기 (프러스텀 컬링)
여러분이 종이를 돌돌 말아 망원경처럼 보면, 구멍 안에 들어온 것만 보이죠? 게임 카메라도 볼 수 있는 범위가 정해져 있어요. 이 범위를 시야 상자(프러스텀)라고 해요. 카메라 뒤에 있거나 옆으로 벗어난 물체는 어차피 안 보여요. 그러니까 그리지 않고 버려요.
② 등 돌린 면 버리기 (백페이스 컬링)
주사위를 손에 들고 보세요. 한 번에 몇 개의 면이 보이나요? 주사위는 면이 6개지만, 한 번에 보이는 건 많아야 3개예요. 나머지 면들은 반대쪽, 그러니까 주사위의 "등"이에요.
3D 물체는 수많은 작은 삼각형 조각으로 만들어져 있어요. 이 중에서 카메라에게 등을 돌리고 있는 삼각형들은 어차피 안 보여요. 그래서 컴퓨터는 이런 "등 돌린 면"을 싹 버려요. 물체 하나마다 그릴 양이 거의 절반으로 줄어들어요. 엄청난 절약이죠!
③ 가려진 물체 버리기 (오클루전 컬링)
드디어 오늘의 주인공, 오클루전(Occlusion)이에요. 오클루전은 "가림"이라는 뜻이에요. 숨바꼭질에서 나무가 친구를 가린 것처럼, 앞에 있는 큰 물체가 뒤에 있는 물체를 가리는 상황을 말해요.
시야 안에 있어도, 등을 돌리지 않았어도, 다른 물체에 완전히 가려져 있으면 역시 안 보여요. 예를 들어 게임 속에서 커다란 성벽 앞에 서 있으면, 성벽 뒤의 집과 나무와 사람들은 하나도 안 보이죠. 오클루전 컬링은 이렇게 가려진 것들을 찾아내서 버리는 기술이에요.
3. 그래도 남는 문제: 누가 앞이고 누가 뒤일까?
버릴 것을 다 버렸어요. 그런데 마지막 문제가 하나 남아요. 그리기로 한 물체들끼리도 서로 조금씩 겹칠 수 있잖아요? 자동차 앞에 사람이 서 있으면, 겹친 부분은 사람을 그려야지 자동차를 그리면 안 돼요.
이때 컴퓨터는 깊이 기억장이라는 걸 써요. 어려운 말로 Z-버퍼라고 해요. 화면의 점 하나하나마다 "여기 그려진 건 카메라에서 얼마나 멀리 있나?"를 적어 두는 공책이에요.
- 새 물체를 그리려고 할 때, 공책을 먼저 봐요.
- "어? 여기엔 이미 더 가까운 게 그려져 있네?" → 안 그려요.
- "여기 있는 것보다 내가 더 가깝네!" → 덮어서 그리고, 공책도 새로 적어요.
키 순서대로 줄을 서서 사진을 찍는 것과 비슷해요. 앞줄 친구가 뒷줄 친구의 몸 일부를 가리면, 사진에는 앞줄 친구가 나오는 게 당연하죠? Z-버퍼는 그 "당연함"을 컴퓨터에게 가르쳐 주는 방법이에요.
4. 언리얼 엔진은 이걸 어떻게 쓸까요?
언리얼 엔진은 게임을 만드는 커다란 도구 상자예요. 그리고 방금 배운 꾀들을 전부 자동으로 해 줘요.
- 시야 밖 버리기: 카메라 범위를 벗어난 물체는 자동으로 그리기 목록에서 빠져요.
- 오클루전 컬링: 언리얼은 매 장면마다 "이 물체, 뭔가에 가려졌나?"를 검사해요. 가려졌으면 그리지 않아요.
- 거리 컬링: 너무 멀리 있어서 점처럼 작게 보이는 물체도 과감히 생략할 수 있어요.
게임을 만드는 사람은 여기에 힌트를 더해 줄 수 있어요. 예를 들어 "이 조각상은 100미터보다 멀어지면 그리지 마"라고 정해 두는 거예요. 컴퓨터가 덜 일하게 도와주는 거죠.
5. 왜 이게 그렇게 중요할까요?
게임 속 커다란 도시를 상상해 보세요. 건물이 1,000개 있어요. 그런데 여러분이 골목 안에 서 있으면, 실제로 보이는 건물은 10개쯤이에요. 컬링이 없다면 컴퓨터는 1,000개를 전부 그리려고 낑낑대요. 컬링이 있으면 딱 10개만 그리면 돼요.
일이 100분의 1로 줄어든 거예요! 그 덕분에 게임은 부드럽게 움직이고, 남는 힘으로 더 예쁜 빛과 그림자를 그릴 수 있어요.
6. 오늘 배운 것 정리
- 컴퓨터는 안 보이는 것은 그리지 않는 꾀를 부려요. 이게 숨은 면 찾기, 즉 은면 제거예요.
- 컬링은 그릴 필요 없는 물체를 골라서 버리는 거예요.
- 시야 밖에 있으면 버리고(프러스텀 컬링), 등을 돌린 면도 버리고(백페이스 컬링), 다른 물체에 가려져도 버려요(오클루전 컬링).
- 남은 물체들끼리 겹칠 때는 깊이 기억장(Z-버퍼)으로 누가 앞인지 가려내요.
- 언리얼 엔진은 이 모든 일을 자동으로 해 줘서, 크고 멋진 게임도 부드럽게 돌아가요.
다음에 게임을 하다가 커다란 벽 앞에 서게 되면 이렇게 생각해 보세요. "지금 이 벽 뒤의 세상은, 컴퓨터가 그리지 않고 쉬고 있구나!" 컴퓨터의 게으름이 아니라, 아주 똑똑한 절약이라는 걸 이제 알겠죠?
출처
리깅 파이프라인 자동화 도구
반복 작업은 스크립트에게. 현업에서 쓰는 리깅 툴 모음.
리깅 도구 보기