노멀 매핑이 못 하는 것
노멀 매핑은 조명 계산에 넘기는 법선만 바꿉니다. 실제 표면은 여전히 평평한 삼각형입니다. 그래서 법선이 관여하지 않는 모든 것이 그대로 남습니다. 한계가 셋으로 갈립니다.
하나. 실루엣이 안 변한다
아래에서 노멀맵과 실제 요철을 번갈아 보세요. 위쪽 띠는 구분이 안 되는데 아래쪽 단면의 선은 한쪽만 물결칩니다.
물체의 가장자리에서는 이 단면 선이 그대로 윤곽으로 보입니다. 아무리 깊게 파인 노멀맵을 붙여도 테두리는 자를 댄 듯 곧습니다.
돌담을 정면에서 보면 그럴듯한데 가장자리로 시선을 옮기는 순간 얇은 판자라는 게 들킵니다.
둘. 그림자를 안 만든다
튀어나온 부분이 옆을 가리는 것을 셀프 섀도잉이라고 합니다. 진짜 요철이라면 낮은 각도의 빛에서 볼록한 쪽이 오목한 쪽에 그림자를 드리웁니다.
노멀 매핑에는 이게 없습니다. 각 픽셀은 자기 법선만 보고 밝기를 정합니다. 옆 픽셀이 자기를 가리고 있는지 알 방법이 없습니다.
그림자가 없으니 깊이감이 약합니다. 특히 빛이 낮게 깔릴 때 “파인 것 같긴 한데 안 깊어 보이는” 인상이 여기서 나옵니다.
셋. 시차가 없다
진짜 요철 위에서 고개를 좌우로 움직이면 튀어나온 부분이 안쪽 부분보다 많이 움직입니다. 가까운 것이 더 빨리 지나가는 현상입니다.
노멀 매핑에서는 이게 0 입니다. 요철의 무늬가 표면에 도장처럼 찍혀 있어서 카메라가 움직여도 제자리에 붙어 있습니다. 밝기만 바뀝니다.
가만히 서서 보면 모르다가 걸어가는 순간 어색해지는 이유입니다.
스치는 각도에서 특히 무너진다
세 한계가 한꺼번에 드러나는 자리가 있습니다. 카메라가 표면을 거의 평행하게 스칠 때입니다.
그 각도에서는 실루엣이 화면의 큰 면적을 차지하고, 요철끼리 서로를 가리는 정도가 최대가 되고, 조금만 움직여도 시차가 크게 납니다. 노멀 매핑은 그 셋을 전부 못 합니다.
바닥과 벽이 가장 큰 문제인 이유가 이겁니다. 플레이어가 바닥을 늘 낮은 각도로 봅니다.
무엇으로 대신하나
- 시차가 생긴다. 높이맵을 따라 시선을 걸어가며 실제로 맞는 자리를 찾아 UV 를 옮깁니다.
- 셀프 섀도잉도 얹을 수 있다. 같은 걸음을 빛 방향으로 한 번 더 하면 됩니다.
- 정점은 그대로 넷이다. 메시를 안 건드립니다.
- 픽셀마다 루프를 돈다. 텍스처 샘플이 한 번이 아니라 수십 번입니다.
- 실루엣은 여전히 곧다. UV 를 옮기는 것뿐이라 테두리는 안 바뀝니다.
- 스치는 각도에서 계단이 보인다. 걸음 수를 늘리면 비용이 그만큼 늡니다.
- 셋을 다 한다. 정점을 실제로 밀어 올리므로 실루엣도 그림자도 시차도 진짜입니다.
- 거리에 따라 조절된다. 멀면 안 쪼개고 가까우면 잘게 쪼갭니다.
- 정점이 실제로 늘어난다. 가까이 가면 그만큼 무거워집니다.
- 모바일에서 쓰기 어렵다. 지원과 성능 모두 걸립니다.
- 인접한 면의 쪼갬 정도가 다르면 틈이 벌어진다. 따로 맞춰 줘야 합니다.
- 아무 조건도 없다. 어떤 파이프라인에서도 그대로 돕니다.
- 충돌 판정도 따라온다. 캐릭터가 그 위를 걸을 수 있습니다.
- 멀리서도 값이 그대로 든다. 화면에서 몇 픽셀이 되어도 정점은 다 처리합니다.
- 잔 굴곡에는 못 쓴다. 긁힘이나 천의 결까지 메시로 만들 수는 없습니다.
| 무엇을 표현하나 | 무엇을 쓰나 |
|---|---|
| 긁힘, 천의 결, 금속 헤어라인 | 노멀맵 |
| 줄눈, 벽돌 사이의 홈, 자갈 바닥 | 노멀맵. 바닥이고 시선이 낮으면 패럴랙스 |
| 튀어나온 손잡이, 깊은 홈, 난간 | 메시 |
| 지형의 기복 | 디스플레이스먼트나 메시 |
실무에서는 대개 섞습니다. 큰 굴곡은 메시로, 중간 굴곡은 패럴랙스로, 잔 굴곡은 노멀맵으로 갑니다.
밉맵에서 값이 무너지는 것
한계는 아니지만 같이 터지는 문제가 있어서 적어 둡니다.
노멀맵도 밉맵을 만듭니다. 그런데 밉맵은 이웃한 네 픽셀의 평균을 내는 방식입니다. 서로 반대로 기운 법선 둘을 평균 내면 가운데 방향이 되면서 길이가 1보다 짧아집니다.
길이가 짧아진 법선을 정규화해서 그냥 쓰면, 원래는 거칠어서 빛이 흩어져야 할 표면이 멀리서 매끈하게 보입니다. 멀어질수록 갑자기 반짝이는 현상이 여기서 나옵니다.
그래서 요즘은 줄어든 길이를 거칠기로 옮겨 적습니다. 법선이 평균으로 뭉개진 만큼 그 밉 레벨의 거칠기를 올려 두는 것입니다. 이걸 노멀맵과 거칠기맵을 같이 굽는 단계에서 처리합니다.
정리
- 노멀 매핑은 법선만 바꾸므로 법선이 관여하지 않는 것은 그대로 남습니다.
- 실루엣이 안 변하고, 셀프 섀도잉이 없고, 카메라가 움직여도 시차가 안 납니다.
- 셋이 한꺼번에 드러나는 자리가 스치는 각도입니다. 바닥과 벽이 가장 문제입니다.
- 시차가 필요하면 패럴랙스 계열, 실루엣까지 필요하면 디스플레이스먼트나 메시로 갑니다. 보통은 규모별로 섞습니다.
- 밉맵에서 법선을 평균 내면 길이가 짧아집니다. 그 값을 거칠기로 옮겨 적어야 멀리서 갑자기 매끈해지지 않습니다.