---
title: "노멀 매핑이 못 하는 것"
description: "법선만 바꾸고 모양은 그대로 두는 거래에는 대가가 따릅니다. 실루엣, 그림자, 시차 셋을 못 하고 스치는 각도에서 무너집니다."
author: "유니얼"
pubDate: 2026-09-14
category: "game-dev/graphics"
tags: ["렌더링", "셰이더", "텍스처"]
canonical: https://blog.unialgames.com/posts/normal-map-limits/
---
노멀 매핑은 조명 계산에 넘기는 법선만 바꿉니다. 실제 표면은 여전히
평평한 삼각형입니다. 그래서 **법선이 관여하지 않는 모든 것**이 그대로
남습니다. 한계가 셋으로 갈립니다.

## 하나. 실루엣이 안 변한다

아래에서 노멀맵과 실제 요철을 번갈아 보세요. 위쪽 띠는 구분이 안 되는데
아래쪽 단면의 선은 한쪽만 물결칩니다.

<x-lit>
<script type="application/json">
{
  "label": "띠는 같은데 가장자리는 다릅니다",
  "modes": ["map", "geo"],
  "note": "면의 가장자리에서 이 선이 그대로 화면에 보입니다. 노멀맵 쪽은 자를 댄 것처럼 곧습니다."
}
</script>
</x-lit>

물체의 가장자리에서는 이 단면 선이 그대로 윤곽으로 보입니다.
아무리 깊게 파인 노멀맵을 붙여도 **테두리는 자를 댄 듯 곧습니다.**

돌담을 정면에서 보면 그럴듯한데 가장자리로 시선을 옮기는 순간
얇은 판자라는 게 들킵니다.

## 둘. 그림자를 안 만든다

튀어나온 부분이 옆을 가리는 것을 셀프 섀도잉이라고 합니다.
진짜 요철이라면 낮은 각도의 빛에서 볼록한 쪽이 오목한 쪽에 그림자를
드리웁니다.

노멀 매핑에는 이게 없습니다. 각 픽셀은 자기 법선만 보고 밝기를 정합니다.
**옆 픽셀이 자기를 가리고 있는지 알 방법이 없습니다.**

그림자가 없으니 깊이감이 약합니다. 특히 빛이 낮게 깔릴 때
"파인 것 같긴 한데 안 깊어 보이는" 인상이 여기서 나옵니다.

## 셋. 시차가 없다

진짜 요철 위에서 고개를 좌우로 움직이면 튀어나온 부분이 안쪽 부분보다
많이 움직입니다. 가까운 것이 더 빨리 지나가는 현상입니다.

노멀 매핑에서는 이게 0 입니다. 요철의 무늬가 표면에 도장처럼 찍혀
있어서 카메라가 움직여도 **제자리에 붙어 있습니다.** 밝기만 바뀝니다.

가만히 서서 보면 모르다가 걸어가는 순간 어색해지는 이유입니다.

## 스치는 각도에서 특히 무너진다

세 한계가 한꺼번에 드러나는 자리가 있습니다. 카메라가 표면을 거의
평행하게 스칠 때입니다.

그 각도에서는 실루엣이 화면의 큰 면적을 차지하고, 요철끼리 서로를
가리는 정도가 최대가 되고, 조금만 움직여도 시차가 크게 납니다.
노멀 매핑은 그 셋을 전부 못 합니다.

바닥과 벽이 가장 큰 문제인 이유가 이겁니다. 플레이어가 바닥을 늘
낮은 각도로 봅니다.

## 무엇으로 대신하나

<x-tabs>
<div class="pc" data-tab="패럴랙스 오클루전 매핑">
<div class="pc-col" data-kind="good">
<span class="pc-tag">장점</span>
<ul><li><b>시차가 생긴다.</b> 높이맵을 따라 시선을 걸어가며 실제로 맞는 자리를 찾아 UV 를 옮깁니다.</li><li><b>셀프 섀도잉도 얹을 수 있다.</b> 같은 걸음을 빛 방향으로 한 번 더 하면 됩니다.</li><li><b>정점은 그대로 넷이다.</b> 메시를 안 건드립니다.</li></ul>
</div>
<div class="pc-col" data-kind="bad">
<span class="pc-tag">단점</span>
<ul><li><b>픽셀마다 루프를 돈다.</b> 텍스처 샘플이 한 번이 아니라 수십 번입니다.</li><li><b>실루엣은 여전히 곧다.</b> UV 를 옮기는 것뿐이라 테두리는 안 바뀝니다.</li><li><b>스치는 각도에서 계단이 보인다.</b> 걸음 수를 늘리면 비용이 그만큼 늡니다.</li></ul>
</div>
</div>
<div class="pc" data-tab="디스플레이스먼트 (테셀레이션)">
<div class="pc-col" data-kind="good">
<span class="pc-tag">장점</span>
<ul><li><b>셋을 다 한다.</b> 정점을 실제로 밀어 올리므로 실루엣도 그림자도 시차도 진짜입니다.</li><li><b>거리에 따라 조절된다.</b> 멀면 안 쪼개고 가까우면 잘게 쪼갭니다.</li></ul>
</div>
<div class="pc-col" data-kind="bad">
<span class="pc-tag">단점</span>
<ul><li><b>정점이 실제로 늘어난다.</b> 가까이 가면 그만큼 무거워집니다.</li><li><b>모바일에서 쓰기 어렵다.</b> 지원과 성능 모두 걸립니다.</li><li><b>인접한 면의 쪼갬 정도가 다르면 틈이 벌어진다.</b> 따로 맞춰 줘야 합니다.</li></ul>
</div>
</div>
<div class="pc" data-tab="그냥 메시로 만들기">
<div class="pc-col" data-kind="good">
<span class="pc-tag">장점</span>
<ul><li><b>아무 조건도 없다.</b> 어떤 파이프라인에서도 그대로 돕니다.</li><li><b>충돌 판정도 따라온다.</b> 캐릭터가 그 위를 걸을 수 있습니다.</li></ul>
</div>
<div class="pc-col" data-kind="bad">
<span class="pc-tag">단점</span>
<ul><li><b>멀리서도 값이 그대로 든다.</b> 화면에서 몇 픽셀이 되어도 정점은 다 처리합니다.</li><li><b>잔 굴곡에는 못 쓴다.</b> 긁힘이나 천의 결까지 메시로 만들 수는 없습니다.</li></ul>
</div>
</div>
</x-tabs>

| 무엇을 표현하나 | 무엇을 쓰나 |
| --- | --- |
| 긁힘, 천의 결, 금속 헤어라인 | 노멀맵 |
| 줄눈, 벽돌 사이의 홈, 자갈 바닥 | 노멀맵. 바닥이고 시선이 낮으면 패럴랙스 |
| 튀어나온 손잡이, 깊은 홈, 난간 | 메시 |
| 지형의 기복 | 디스플레이스먼트나 메시 |

실무에서는 대개 섞습니다. 큰 굴곡은 메시로, 중간 굴곡은 패럴랙스로,
잔 굴곡은 노멀맵으로 갑니다.

## 밉맵에서 값이 무너지는 것

한계는 아니지만 같이 터지는 문제가 있어서 적어 둡니다.

노멀맵도 밉맵을 만듭니다. 그런데 밉맵은 이웃한 네 픽셀의 평균을 내는
방식입니다. **서로 반대로 기운 법선 둘을 평균 내면 가운데 방향이 되면서
길이가 1보다 짧아집니다.**

길이가 짧아진 법선을 정규화해서 그냥 쓰면, 원래는 거칠어서 빛이 흩어져야
할 표면이 멀리서 매끈하게 보입니다. 멀어질수록 갑자기 반짝이는 현상이
여기서 나옵니다.

그래서 요즘은 **줄어든 길이를 거칠기로 옮겨 적습니다.** 법선이 평균으로
뭉개진 만큼 그 밉 레벨의 거칠기를 올려 두는 것입니다.
이걸 노멀맵과 거칠기맵을 같이 굽는 단계에서 처리합니다.

## 정리

- 노멀 매핑은 법선만 바꾸므로 법선이 관여하지 않는 것은 그대로 남습니다.
- 실루엣이 안 변하고, 셀프 섀도잉이 없고, 카메라가 움직여도 시차가 안 납니다.
- 셋이 한꺼번에 드러나는 자리가 스치는 각도입니다. 바닥과 벽이 가장 문제입니다.
- 시차가 필요하면 패럴랙스 계열, 실루엣까지 필요하면 디스플레이스먼트나 메시로 갑니다. 보통은 규모별로 섞습니다.
- 밉맵에서 법선을 평균 내면 길이가 짧아집니다. 그 값을 거칠기로 옮겨 적어야 멀리서 갑자기 매끈해지지 않습니다.