Artoke

그림자 매핑: 빛이 못 본 곳이 그림자다

그림자 매핑: 빛이 못 본 곳이 그림자다 대표 이미지
출처: 그림자 매핑

그림자 매핑: 빛이 못 본 곳이 그림자다

해가 쨍한 날 밖에 나가면 발밑에 검은 얼룩이 따라다닙니다. 그림자죠. 우리는 너무 익숙해서 신경도 안 씁니다.

그런데 게임 속 세상에는 그림자가 저절로 생기지 않습니다. 누군가 계산해서 그려 넣어야 합니다. 그 방법 중 가장 유명한 게 그림자 매핑(Shadow Mapping)입니다. 1978년에 랜스 윌리엄스라는 사람이 처음 만들었고, 지금도 거의 모든 게임이 이 방식을 씁니다.

그림자가 없으면 어떻게 보일까

먼저 그림자를 지운 장면을 봅시다.

그림자가 없는 3D 장면
Scene with no shadows · 출처: 그림자 매핑

뭔가 이상하죠. 물체들이 바닥에 붙어 있는지, 공중에 떠 있는지 알 수 없습니다. 스티커를 붙여 놓은 것 같습니다.

그림자는 단순한 장식이 아닙니다. 물체가 어디에 놓여 있는지 알려주는 정보입니다. 그래서 그림자가 빠지면 그림이 가짜처럼 보입니다.

핵심 아이디어: 빛의 눈으로 보기

그림자 매핑의 아이디어는 딱 한 문장입니다.

빛에게 눈이 있다고 치자. 빛이 못 보는 곳이 그림자다.

손전등을 생각해 보세요. 손전등 앞에 컵을 두면, 컵 뒤쪽 벽은 어두워집니다. 왜냐면 손전등 입장에서는 컵에 가려서 그 벽이 안 보이니까요.

숨바꼭질과 똑같습니다. 술래(빛)의 눈에 안 보이면 숨은 것(그림자)입니다.

1단계 — 빛의 자리에 카메라를 놓는다

그래서 컴퓨터는 먼저 빛이 있는 위치에 카메라를 놓고 장면을 한 번 찍습니다.

빛의 위치에서 바라본 장면
Scene rendered from the light view · 출처: 그림자 매핑

이건 우리가 보는 화면이 아닙니다. 계산을 위해 몰래 한 번 더 찍는 사진입니다.

2단계 — 색 대신 '거리'를 기록한다

여기가 재미있는 부분입니다. 이 사진에는 색깔을 저장하지 않습니다. 대신 빛에서 그 물체까지 얼마나 먼지를 저장합니다.

빛에서 본 깊이 지도. 가까울수록 밝고 멀수록 어둡다
Scene from the light view, depth map · 출처: 그림자 매핑

가까우면 밝게, 멀면 어둡게 칠한 흑백 사진처럼 보입니다. 이걸 깊이 지도(depth map) 또는 그림자 맵이라고 부릅니다.

쉽게 말하면 이런 메모장입니다.

  • 이 방향으로 3미터 가면 뭔가 있음
  • 저 방향으로 7미터 가면 뭔가 있음
  • 또 저 방향은 12미터까지 아무것도 없음

빛이 각 방향에서 제일 먼저 부딪힌 물체까지의 거리만 적어 둔 표입니다.

3단계 — 두 숫자를 비교한다

이제 우리 눈(카메라)으로 장면을 그립니다. 화면의 점 하나하나마다 컴퓨터가 이렇게 묻습니다.

"이 점은 빛에서 얼마나 떨어져 있지?" → 예를 들어 7미터.

그리고 아까 만든 메모장을 펼쳐 같은 방향을 찾아봅니다. 거기 적힌 숫자가 3미터라면?

빛은 3미터 지점에서 이미 막혔다는 뜻입니다. 7미터에 있는 이 점까지 빛이 도달할 수 없습니다. 그러니까 그림자입니다.

반대로 메모장에도 7미터라고 적혀 있으면, 이 점이 바로 빛이 처음 만난 곳입니다. 환하게 칠합니다.

그림자 매핑: 빛이 못 본 곳이 그림자다 도식

정리하면 규칙은 이거 하나입니다.

지도에 적힌 거리보다 내가 더 멀면 → 그림자.

지도를 장면 위에 씌워 보면

아까 만든 깊이 지도를 장면 위에 그대로 덮어씌우면 이렇게 보입니다.

깊이 지도를 장면 위에 투영한 모습
Visualization of the depth map projected onto the scene · 출처: 그림자 매핑

빛에서 찍은 사진을 슬라이드 영사기처럼 장면에 쏘는 셈입니다. 그래서 이 기법을 '그림자 투영'이라고도 부릅니다.

완성된 그림

물체가 바닥에 제대로 놓여 있는 게 느껴지죠. 아까 그림자 없던 장면과 비교하면 차이가 큽니다.

가끔 실패한다: 그림자 여드름

이 방법에는 약점이 있습니다. 깊이 지도는 사진이라서 칸(픽셀)이 정해져 있습니다. 모눈종이에 그린 지도 같은 거예요.

모눈이 굵으면 세밀한 곳에서 오차가 납니다. 밝아야 할 자리인데 계산이 살짝 어긋나 "너는 더 멀어!"라는 판정이 나오죠. 그러면 이렇게 됩니다.

깊이 비교가 실패해 얼룩덜룩한 줄무늬가 생긴 모습
Depth map test failures · 출처: 그림자 매핑

얼룩덜룩한 줄무늬가 생깁니다. 개발자들은 이걸 그림자 여드름(shadow acne)이라고 부릅니다. 이름이 참 솔직하죠.

해결법도 단순합니다. 비교할 때 살짝 봐줍니다. "0.05미터 정도 차이는 그냥 밝은 걸로 치자"라고 여유를 주는 겁니다. 이 여윳값을 바이어스(bias)라고 합니다.

단, 너무 많이 봐주면 그림자가 물체에서 둥둥 떠 보입니다. 적당히 조절하는 게 기술입니다.

왜 아직도 이 방법을 쓸까

더 정확한 방법도 있습니다. 빛을 한 줄기씩 실제로 쏘아보는 방식(레이 트레이싱)이죠. 하지만 느립니다.

그림자 매핑은 사진 한 장 더 찍고, 숫자 두 개 비교하기가 전부입니다. 그래픽 카드가 제일 잘하는 일이라 엄청나게 빠릅니다.

그래서 1978년에 나온 아이디어가 40년 넘게 현역입니다. 언리얼 엔진에서 조명을 놓고 그림자 해상도(Shadow Map Resolution) 같은 값을 만질 때, 여러분이 조절하고 있는 게 바로 이 '모눈종이의 촘촘함'입니다.

세 줄 요약

  • 빛의 자리에서 장면을 한 번 찍어 거리 지도를 만든다.
  • 화면의 각 점이 지도에 적힌 거리보다 멀면 그림자, 같으면 밝다.
  • 지도가 거칠면 얼룩이 생기고, 그때는 바이어스로 살짝 봐준다.

출처

광고

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

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

리깅 도구 보기