
3D 작업은 아직까지는 결국 2D로 표현 됩니다. 즉 3차원의 여러 값들을 계산하여 2D 즉 이차원 평면에 표현함으로서. 시각적으로 3차원의 공간을 느끼는 것이지요. 영화에서처럼 3D 디스플레이 방식이 도입된다면 다른 예기가 되겠지만. 아직까지는 그렇습니다. 그것은 Pre-rendering 방식의 애니메이션이든, Realtime-rendering 방식의 게임이든 마찬가지입니다.
즉 3D의 복잡한 작업은 결국엔 x,y 평면의 하나하나의 점들로서 다시 표현되는데. 모델링을 시작으로 매트리얼 셋업, 텍스쳐링, 라이팅, 랜더링 세팅 모두가 결국엔 이 하나하나의 점을 어떻게 표현할 것인가에 영향을 주는 것입니다.
이것은 아주 초초초초보적인 개념일지 모르지만 아주 중요합니다. 3D 작업의 모든 원리는 이곳에서 부터 시작한 것이니까요.. 그렇기에 사실 2D작업의 여러가지 개념들을 익혀두는 것이 좋습니다. 정확하게는 Raster(Bitmap)의 개념이겠지요.
너무 당연한 논리이지만. Normal Map, Bump Map도 이러한 큰 범주 안에 들어갑니다. 앞에 살펴보았던 많은 요소들중에 Texture 파트가 되는 것이지요. 결론은 이 두가지 맵은 최종적으로는 랜더링 될 2D 이미지에 어떠한 영향을 준다는 것입니다. 이러한 관점에서 보시면 앞으로의 설명이 좀더 쉽게 들어오실 겁니다.
1. Bump map
노말맵이 있기 전까지는 Bump Map과 Displacement Map은 대역폭이 다르긴 하지만 하나의 채널 즉 흑백의 이미지만을 사용했습니다. 즉 어둡고 밝고의 개념만이 존재했던 것이지요. 밝은 부분은 튀어나오고. 어두운 부분은 들어간다가. 가장 기본적인 원리입니다. (이러한 1 chanel 사용은 Diffuse Map을 제외한 대부분의 Map들도 마찬가지이지요.)
![]() Bump Map | ![]() Rendering image | ![]() Scene setup |
디스플레이스의 경우는 좀 복잡하지만 범프의 경우는 아주 간단한 원리로 랜더링에 영향을 끼칩니다. 텍스쳐 이미지에서 전의 픽셀(A)과 다음의 픽셀(B)값에 차이가 있을경우 그리고 편의상 라이트가 한개 존재 할 경우에 랜더링에 다음과 같은 공식으로 랜더링이 될겁니다.
범프맵의 픽셀 밝기 값은 0~255. "A" 와 "B" 두개의 값이 있음.
라이트의 값 " L " 은 A와 B 사이의 Normal(수직 방향)을 90으로 하여 A쪽으로 기울수록 0에 가깝고 B쪽으로 가까울수록 180이 되도록 값을 계산
범프값을 제외한, 픽셀A와 대응되는 랜더링 이미지의 픽셀을 "A1"
범프값을 제외한, 픽셀B와 대응되는 랜더링 이미지의 픽셀을 "B1"
범프값이 포함된 랜더링 이미지의 픽셀을 "A2", "B2"
라고 친다면
A2 = A1 + {(B-A)*(L-90)}/90
B2 = B1 + {(A-B)*(L-90)}/90
(* "90"으로 나눈것은. 변형 최대치가 255 가 되게끔 한것, 범프맵의 value 값이 여기서 정해지겠죠.. ㅎㅎ)
라이트의 값 " L " 은 A와 B 사이의 Normal(수직 방향)을 90으로 하여 A쪽으로 기울수록 0에 가깝고 B쪽으로 가까울수록 180이 되도록 값을 계산
범프값을 제외한, 픽셀A와 대응되는 랜더링 이미지의 픽셀을 "A1"
범프값을 제외한, 픽셀B와 대응되는 랜더링 이미지의 픽셀을 "B1"
범프값이 포함된 랜더링 이미지의 픽셀을 "A2", "B2"
라고 친다면
A2 = A1 + {(B-A)*(L-90)}/90
B2 = B1 + {(A-B)*(L-90)}/90
(* "90"으로 나눈것은. 변형 최대치가 255 가 되게끔 한것, 범프맵의 value 값이 여기서 정해지겠죠.. ㅎㅎ)
수치를 대입해 보면
A=55 , B=65 , L=45 , A1=100 , B1=100 일 경우 A2 = 92.5. B2 = 107.5
수학적으로 써 놓으니 복잡해 보이지만(실제 프로그래밍 상에서는, 좀더 세련되었고. 기준이 되는 값이 존재하리라 생각합니다). A픽셀이 B픽셀보다 밝고. 라이트가 A쪽에서 비추었음으로 A픽셀부분의 최종랜더링은 좀더 밝게, B쪽 부분은 좀더 어둡게 표현된다는 말입니다.
범프값은 범프값 자체의 음영차이와 라이트의 기울기를 기준으로 "밝으냐, 어두우냐?"의 두가지 값중 하나를 만들어 내는 일종의 트릭입니다. 이 방법은 단순 요철을 표현하는데 아직까지도 활용도가 높지만, 좀더 정확한 모양을 만들어 낼 순 없습니다. 또한 카메라와의 기울기등은 고려되지 않고 쉐도우 또한 적용되지 않습니다. 그런 점 때문에 고 퀄리티의 프리랜더드 영상의 경우엔 Displacement Map을 활용하는 것이지요.
여기서 꼭 기억하고 넘어가야 할 것은 바로 "높낮이"라는 개념으로 사용되는 것이 바로 Bump라는 것입니다. 밝을수록 높고,. 어두울수록 낮다 라는 것이지요.
![]() 범프적용 | ![]() 쉐도우는 적용되지 않음 | ![]() 기울였을때 확실히 어색 |
![]() 디스플레이스적용 | ![]() 쉐도우 적용됨 | ![]() 기울여도 그대로 |
2. Normal Bump Map의 개념
앞에서 범프맵은 흑백의 한가지 채널만을 사용한다고 말씀드렸습니다. 노말맵은, 대부분의 다른 맵들과 다르게. 3가지 채널을 이용합니다. 비트맵 이미지에서는 Red, Green, Blue 채널을 이용하여 표현되지만. 실제로 쓰이는 의미는 "수직" "수평" "깊이" 즉 x,y,z 축으로의 값을 표현하는 것입니다.
Bump, Displacement Map과 Normal Map의 가장 큰 차이점은 전자는 값이 차이로 높낮이를 표현한다면, 후자는 각 채널별 값들이 각각 기울기를 나타냄으로서, 매쉬상의 한 점은 최종적으로 x,y,z 축의 기울기 모두를 갖게 되는 것입니다.
이제부터 본격적으로 Normal Map의 원리를 이해해야 하는데, 먼저 쉬운 개념부터 출발해 봅시다.

노말방향과 라이팅 방향의 차이를 음영으로 변환하기
이 그림은 가장 기초적인 3D 씬입니다. 하나의 라이트가 오브젝트로는 구가 하나 있지요.
이러한 환경에서 각각의 면은, Normal값과 Lighting방향의 기울기 차이를 이용해서 계산됩니다. Normal값과 Lighting의 기울기 차이가 O일때 이면은 빛을 100% 받게되며, 기울기가 90이 되면 그때부터는 빛을 전혀 받지 못하게 됩니다.
이러한 원리는 랜더링할때 사용되는 기초적인 개념이지만, 이것을 텍스쳐링에 활용한 것이 바로 노말맵입니다. 위 오른쪽 그림에서 처럼, 하나의 라이트에 대한 각각의 면의 기울기 값은, 각기 다른 명암을 만들어 내는데, 이러한 라이트를 위-아래,좌-우,앞-뒤로 총 6방향에서 빛을 쏘아 이것을 하나의 맵으로 만든것이 노말맵입니다.

노말맵의 원리
일단 Positive Light는 가각의 채널의 0~127 계조를 담당하게 되며 Negative Light는 나머지 128~255 까지의 계조를 담당하게 됩니다. 즉 하나의 채널은 두개의 라이트 값을 갖게 되는 것이지요.
이러한 방식을 써서 면에 떨어진 라이팅 값을 텍스쳐로 변환하게 되면, 모든 위치점은 모두 3개의 RGB값을 갖게 되며, 이러한 RGB값은 다시 말해, X,Y,Z축으로부터의 기울기값 3개를 얻게된다는 것입니다. (기울기로 부터 음영값을 계산했듯이, 음영값으로부터 역으로 기울기를 계산하게 되는 것이죠) 그리고 3가지 방향의 기울기 값은 완벽하게 3D 상의 하나의 기울기. 즉 Normal 값을 갖게 되는 것입니다.
지금 에로 들은 방식은 최근에는 기준이 되어버린 Tangent 방식의 Normal Map과는 약간의 차이가 있습니다. 나중에 좀더 자세히 설명드릴 기회가 있겠지만,Tangent방식은 각각의 면을 기준으로 R,G,B값을 산출하는데, 하나의 면에서 뒤쪽면을 고려할 필요가 없기때문에 Blue 채널(앞,뒤정보)는 반쪽만 쓰이게 됩니다. Tangent Map이 푸르딩딩한 이유가 바로 거기에 있습니다.
오늘은 일단 여기까지 인데요. 어찌하여 노말맵에 그토록 찬사를 보내왔는지 대강 감은 잡으셨을껍니다. Mesh가 랜더링 되어 하나의 모양을 갖추는데는 Normal 값이 1차적인 "음영"을 계산하는데 큰 역활을 하는데, 이러한 Normal 값을 가상적으로 만들어 내었다는 것이 바로 핵심이 되겠지요.
기존의 Bump는 단순히 어둡고 밝음을 표현하는데 "깊이정보"로 표현하는데 그쳤다면. 노말맵은 x.y.z 축의 기울기 값을 통해 정확한 "Normal Direct"를 찾아주기 때문에, 존재하지 않는 Mesh가 생성된듯한 효과를 주게 되는 것입니다. 하지만 Normal Map으로 생성된 가상의 기울기 값들도, 기존의 Mesh에서만 랜더링 되기 때문에 일반 Bump Map과 비슷한 한계를 가집니다. 이 부분에 대해선 직접 만들어 보면서 자세히 설명드릴 기회가 있을겁니다.
다음 시간엔, 오늘의 개념을 활용하여, Normal Map 제작툴을 활용하지 않고, Lighting을 이용해 Normal Map을 만들어 보면서, 좀더 확실한 개념을 잡아보도록 하겠습니다.









댓글을 달아 주세요
좋은 강좌 감사드립니다.
네엥 ^^
허걱!! 도대체 이런 사실들은 어떻게 알고 계신건지..놀랍습니다..^^ 개념까지 알게 되니 단순히 기능만 알때보다 도움이 많이 되는거 같습니다. 앞으로도 부탁드립니다.
저 역시 개념들을 제대로 파악하고 있는게 많은것이 아닙니다. 친구들의 도움도 받고. 이미 제작된 많은 튜터리얼을 통해 하나씩 배워나가는 것이죠.. ^^
지애님 사이트에서 항상 좋은 정보 얻고갑니다^^
감사합니다. ^^
개념들을 알고만 있다가 막상 정리된 글을 보니 너무 반갑군요^^ 감사합니다.
감사합니다. ㅎㅎㅎ 쿨럭