우리의 모든 장면(scene)은 메시(mesh)들로 가득 차 있고, 각 메시들은 수백 개, 어쩌면 수천 개의 삼각형으로 이루어져 있다. 우리는 이 평평한 삼각형들에 2D 텍스처를 감싸 입혀서, 폴리곤이 그저 작은 평평한 삼각형들에 불과하다는 사실을 숨기며 사실감을 높였다. 텍스처는 도움이 되지만, 메시를 가까이에서 자세히 보면 여전히 밑바탕의 평평한 표면이 쉽게 보인다. 그러나 대부분의 실제 표면은 평평하지 않고 많은(울퉁불퉁한) 디테일을 보인다.
예를 들어, 벽돌 표면을 생각해보자. 벽돌 표면은 꽤 거친 표면이고 분명 완전히 평평하지 않다: 움푹 들어간 시멘트 줄이 있고, 아주 작은 구멍과 균열 같은 세밀한 디테일이 많다. 이런 벽돌 표면을 조명이 있는 장면에서 본다면 몰입감은 쉽게 깨진다. 아래에서는 점광원으로 조명된 평면에 벽돌 텍스처가 적용된 모습을 볼 수 있다.

점광원으로 조명된 벽돌 표면. 그다지 현실적이지 않다; 평평한 구조가 이제 매우 분명하다.
조명은 작은 균열과 구멍을 전혀 고려하지 않고 벽돌 사이의 깊은 줄을 완전히 무시한다; 표면은 완전히 평평해 보인다. 깊이나 다른 디테일 때문에 일부 표면이 덜 조명된 것처럼 가장하기 위해 스페큘러 맵을 사용함으로써 평평해 보이는 느낌을 부분적으로 고칠 수 있지만, 이는 진짜 해결책이라기보다 요령에 가깝다. 우리가 필요한 것은 표면의 모든 작은 깊이 같은 디테일을 조명 시스템에 알려줄 수 있는 어떤 방법이다.
이것을 빛의 관점에서 생각해보면: 왜 표면이 완전히 평평한 표면처럼 조명되는가? 답은 표면의 법선 벡터(normal vector)다. 조명 기법의 관점에서, 객체의 형태를 결정하는 유일한 방법은 그 표면에 수직인 법선 벡터뿐이다. 벽돌 표면은 단 하나의 법선 벡터만 가지며, 그 결과 표면은 이 법선 벡터의 방향에 따라 균일하게 조명된다. 그렇다면, 조각(fragment)마다 모두 동일한 표면 법선 대신, 각 조각마다 서로 다른 픽셀 단위(per-fragment) 법선을 사용하면 어떨까? 이렇게 하면 표면의 작은 디테일에 따라 법선 벡터를 약간씩 빗나가게 할 수 있고; 이것은 표면이 훨씬 더 복잡하다는 환상을 준다:
표면 단위 법선과 픽셀 단위 법선을 보여주는 표면

픽셀 단위 법선을 사용함으로써 우리는 조명을 속여 표면이(법선 벡터에 수직인) 아주 작은 평면들로 이루어진 것처럼 믿게 만들어, 표면의 디테일을 엄청나게 끌어올릴 수 있다. 표면 단위 법선 대신 픽셀 단위 법선을 사용하는 이 기술을 노멀 매핑(normal mapping) 또는 범프 매핑(bump mapping) 이라고 부른다. 이것을 벽돌 평면에 적용하면 대략 다음과 같이 보인다:
노멀 매핑 전/후의 표면

보는 바와 같이, 상대적으로 낮은 비용으로 엄청난 디테일 향상을 제공한다. 우리는 각 조각마다 법선 벡터만 바꾸기 때문에 조명 방정식을 바꿀 필요는 없다. 이제 보간된 표면 법선 대신 픽셀 단위 법선을 조명 알고리즘에 전달한다. 나머지는 조명이 처리한다.
노멀 매핑이 작동하도록 하려면 픽셀 단위 법선이 필요하다. 디퓨즈와 스페큘러 맵에서 했던 것과 유사하게, 2D 텍스처를 사용해 픽셀 단위 법선 데이터를 저장할 수 있다. 이렇게 하면 특정 조각에 대한 법선 벡터를 얻기 위해 2D 텍스처를 샘플링할 수 있다.
법선 벡터는 기하학적 개체이고 텍스처는 일반적으로 색상 정보에만 사용되므로, 텍스처에 법선 벡터를 저장한다는 것이 바로 명확하지 않을 수 있다. 텍스처의 색상 벡터를 생각해보면 r, g, b 성분을 가진 3차원 벡터로 표현된다. 이와 유사하게 법선 벡터의 x, y, z 성분을 해당하는 색상 성분에 저장할 수 있다. 법선 벡터는 -1과 1 사이의 범위를 가지므로 먼저 [0,1]로 매핑된다:
vec3 rgb_normal = normal * 0.5 + 0.5; // [-1,1]을 [0,1]로 변환
이와 같이 법선 벡터를 RGB 색상 성분으로 변환하면, 표면의 형상에서 파생된 픽셀 단위 법선을 2D 텍스처에 저장할 수 있다. 이 장의 시작 부분에 나온 벽돌 표면의 예시 노멀 맵은 아래와 같다:
노멀 매핑에서의 노멀 맵 이미지