2004년 발표된 언리얼 엔진 3 테크데모 자료.# 1천만에 육박하는 하이폴리곤 모델이 언리얼 엔진 유틸리티를 거쳐 5천~1만 개 이내의 로우 폴리곤 모델로 변환된 결과물이다. 폴리곤이 엄청나게 줄었음에도 원래의 하이폴리곤 모델과 비슷한 결과물을 리얼타임으로 렌더링할 수 있다.[1] 비슷하게 2억개의 폴리곤이 사용된 광장 씬은 폴리곤 수가 50만개로 줄어들었다. |
1. 개요
노멀 매핑(Normal Mapping)은 폴리곤의 법선 벡터(Normal Vector)의 값을 사용하여 로우 폴리곤의 그래픽 환경에서 하이 폴리곤의 입체감 및 질감을 구현하는 방법이다. 물체의 질감을 있는 그대로 폴리곤으로 표현하면 삼각형의 양이 많아지고 결국 연산이 많이 필요하게 되는데 폴리곤을 무척 적게 사용하고도 비슷한 효과를 낼 수 있는 기술이다. 1990년대까지는 논문에서나 존재하던 기술이었으나 하드웨어의 속도가 빨라지고 프로그래머블 셰이더가 일반화되는 2000년대 중반부터 널리 사용되기 시작하였다.여기서 Normal이란 단어의 의미는 "보통"이라는 뜻이 아닌 수학에서의 법선이라는 의미로 동음이의어인 영어 단어다.
2. 원리
물체의 표면에 굴곡이 있을 때 그 굴곡 때문에 표면의 방향이 바뀌고 그 방향에 따라 빛이 다르게 반사되기 때문에 보는 사람이 그 굴곡을 느낄 수 있다. 결국 표면 질감에서 중요한 건 진짜 굴곡이 아닌 반사각이기 때문에 3D그래픽으로 물체를 표현할 때 표면을 실제로 굴곡이 있는 형태로 만들지 않고, 평면으로 만들고 그 위에 어떤 각도로 보일지 그려놓으면 하나의 폴리곤으로 굴곡이 있는 표면을 표현할 수 있다.광원을 받은 폴리곤이 면(Plane) 단위로 음영을 처리하는 단순한 방식을 플랫 셰이딩(Flat Shading)이라고 한다. 폴리곤이 등장한 매우 초창기에는 이런 방식을 사용했다.
해당 면을 구성하는 꼭짓점(Vertex: 정점)을 기준으로 그 중간의 사이를 보간하는 음영처리를 하는 방식을 Per-Vertex(꼭짓점 단위) 라이팅, 그것에 의해 음영이 처리되는 방식을 고라우드 셰이딩(Gouroud Shading)이라고 부른다. 이것은 1990년대 중반부터 2000년대 중반까지의 게임들에서 사용된 방식이다.
픽셀(Pixel)을 기준으로 라이팅을 부드럽게 처리하는 방식을 Per-Pixel(픽셀 단위) 라이팅, 그것에 의해 음영이 처리되는 것을 퐁 셰이딩(Phong Shading)이라고 부른다. 이 방식은 2000년대 중반 이후의 게임들부터 계속 사용되는 방식이다.
노멀 매핑은 기본적으로 꼭짓점의 법선 벡터값을 이미지(노멀맵 텍스처)로 저장한 후 저장된 법선 벡터값이 마치 실제 폴리곤의 법선 벡터인 것처럼 노멀맵 텍스처가 광원을 받아 음영을 처리한다. 픽셀로 된 텍스처 이미지에 음영 처리를 하게 되므로 노멀 매핑에는 반드시 Per-Pixel(픽셀 단위) 라이팅이 필요하다. 즉, 픽셀 단위 라이팅은 노멀 매핑이 필수가 아니지만 노멀 매핑은 픽셀 단위 라이팅을 필수로 요구한다.
이러한 원리로 폴리곤 수를 줄이고 노멀매핑으로 표면을 표현하면 많은 수의 폴리곤을 썼을 때보다 훨씬 적은 시스템 리소스로 동일한 시각적 효과를 얻을 수 있으므로 같은 연산 능력으로 높은 품질의 그래픽을 얻을 수 있다. 배경이나 캐릭터 어느 것에도 제한되지 않고 폴리곤을 사용하는 모든 표면에 적용이 가능하기 때문에 게임 그래픽 수준 전반을 획기적으로 향상시켜 준다.
3. 역사
노멀 매핑이 대중화되지 않았던 시절에는 입체감 있는 모델을 만들려면 폴리곤의 수를 늘려서 실제로 그대로 모양을 만들어 주어야만 했다.[2] 그런 복잡하고 입체감 있는 모델을 만들려면 실제로 수백만 개의 폴리곤이 필요하지만 이 기술을 이용하면 그런 복잡한 정보를 단 한 장의 노멀맵 텍스처를 통해 바꿀 수 있게 된다. 하이 폴리곤 모델과 흡사한 입체감을 보여주면서도 폴리곤은 고작 수백 개의 로우 폴리곤 모델만 사용해도 된다. 수백만 개의 삼각형을 계산할 필요가 없으니 부하가 엄청나게 줄어드는 것은 당연지사.기술 자체는 1970년대에 개발됐지만 2004년 전후를 기점으로 PC/비디오 3D 게임에서 본격적으로 사용되었고, 이는 3D 게이밍 그래픽 수준에 혁명으로 작용하게 된다.
4. 필요성
컴퓨터 그래픽에서 폴리곤은 그 꼭짓점의 개수가 많으면 많아질수록 파일 크기와 메모리를 차지하는 비중, 그리고 그것을 실시간으로 화면에 처리하는 데 필요한 연산량과 비례한다.광원, 셰이더 및 각종 특수효과와 텍스처 등을 모두 제외하고 폴리곤만을 화면에 출력한다고 할 때 약 100만(1,000,000) 개의 삼각형으로 이루어진 폴리곤을 4~5개체 정도만 화면에 출력해도[3] 2020년대 기준 최신 고사양 컴퓨터에서도 과도한 연산량을 버티지 못하고 굼벵이처럼 느려질 것이다.
하지만 노멀 매핑은 텍스처에 폴리곤의 법선 벡터 정보를 모두 담아버리므로 아무리 다수의 삼각형으로 이루어진 폴리곤이라도 노멀 맵으로 저장된다면 파일의 용량이나 메모리의 사용량은 노멀 맵 텍스처의 해상도만큼 메모리를 차지할 뿐이고, 연산량도 텍스처 한 장에 Per-Pixel 라이팅을 행하는 정도에 그치기 때문에 실시간으로는 절대 불가능한 수준의 많은 삼각형으로 이루어진 폴리곤의 음영 효과를 그보다 훨씬 적은 폴리곤 위에 입혀 적은 연산량으로 높은 퀄리티의 효과를 볼 수 있다.
여기에 꼼수로 노멀 맵 텍스처의 해상도를 줄여버리면 효율은 더욱더 올라간다. 엘더스크롤 4: 오블리비언의 고해상도 텍스처 모드에서 반필수적으로 활용되기도 했고, 비슷한 시기에 출시된 콜 오브 듀티 시리즈들도 자동 옵션 조절을 통해 비슷한 꼼수를 지원하기도 했다.[4]
5. 제작 방법
노멀 벡터의 형태 |
물체 표면의 3차원 방향이 노멀 벡터(Normal Vector)(이하 노멀)이다. 굴곡이 있는 표면은 노멀 벡터가 지점마다 변하게 되는데 어느 지점에서 노멀이 어떤 값인지 전부 모아놓은 것이 노멀맵이다. 노멀맵 텍스처 이미지는 이러한 물체의 노멀 정보(양측 180도의 X,Y,Z 각도)를 텍스처 이미지 형태의 저장공간(0-255 값의 R, G, B 색상채널)에 저장해 둔 것으로, 이 노멀맵 텍스처를 비슷한 형태의 저해상도 모델에 적용해서 텍셀의 셰이딩(물체의 음영이 어떻게 보여질지 처리하는 과정) 계산 시 고해상도 모델에서 쓰였던 노멀 정보로 렌더링하게 된다.
여담으로 탄젠트 프로젝션 방식에서 Z축은 X, Y하고는 달리 자전하면서 헛도는 축이라 양감에 관여하지 못하고 사실상 R,G 채널만 노멀값에 활용되는데, 보통 알뜰한 용량 활용을 위해 B 채널에 Z축 각도대신 AO(광 차폐도 = 구석져 있는 정도)나 Cavity(주변 법선과의 각도 차이= 모나고 접힌 정도) 정보를 넣고 노멀 겸 Ambient Occlusion 혹은 Cavity 맵으로 쓴다.[5] 그래서 이 B 채널은 보통 하얀 바탕이 깔려있고 각진 부분만 어두운 식으로 그려지는데, 이 때문에 날것의 노멀 맵 텍스처는 대개 푸르스름한 빛을 띠게 된다.
노멀 매핑 추출을 위한 하이폴리곤 모델 |
노멀 맵 제작 방식은 위와 같이 하이 폴리곤 3D에서 따오는 것,[6] 양감의 각도를 계산해서 노멀 맵 텍스처를 수동으로 그리는 것[7] 등 여러 방법이 있다.
6. 특징
노멀 맵 셰이더의 가장 기본적인 목표는 삼각형 조각 몇 개로 이루어진 삼차원 표면에 더 복잡한 모양의 음영을 투사해서 마치 표면이 복잡한 것처럼 그려내는 데에 있다. 실제로 노멀맵이 적용된 3D 물체를 이리저리 돌려 보면 경계면이 의외로 단순한 것을 알 수 있다. 비스듬히 볼 때 느껴지는 이 어색함을 없애기 위해 높이값의 정보를 받아와 그러한 상황에서도 자연스러운 표현을 해주는 패럴랙스 방식의 매핑도 있다.[8] 여담이지만 노멀맵 개발 이전에는 텍스처 하나에 그림자를 교묘하게 그려 넣어, 위와 같은 착각을 유도하는 경우가 많았다. tri 이전에 나온 몬스터 헌터 시리즈, 리그 오브 레전드 등의 게임들은 이러한 방식을 사용 중이다. 흔히 손맵이라고 불리며 금세 도태될 것이라 여겨졌지만, 아직도 하드웨어 수준이 고급 셰이더 기술을 소화하기 힘든 모바일 환경이나 특정한 그림체를 지향하는 경우에서는 현역으로 뛰고 있다.[9]이렇게 3D 게임과 같은 저사양 3D 렌더환경에서의 디테일을 위해 애용되는 노멀맵이지만 요즘은 일부 2D 게임에서도 실시간 광원의 영향에 따른 양감을 자유롭게 표현하기 위해 노멀 맵을 쓰는 경우가 있고 이를 제작하기 위한 프로그램도 나와있다. Sprite Lamp 참조.
노멀 맵을 사용한 게임들 중 일부는 특유의 느낌이 나는 경우가 있는데 그것은 주름 같은 높낮이가 심한 굴곡이 두드러진다는 점이다. 그 이유는 노멀 맵을 추출하기 위한 하이 폴리곤 모델을 대부분 ZBrush라는 툴에서 찰흙을 빚듯이 만들어내기 때문에 그런 느낌이 나게 되는 것이다. 스타2를 떠올려보자. 요즘 나오는 게임들은 노하우가 발달해서 괜찮지만 스타2의 저사양 옵션은 찰흙크래프트라는 별명이 붙을 정도였다.[10]
카툰 렌더링 기반의 캐주얼 게임이라든지, 손맵 텍스처로 승부를 보는, 월드 오브 워크래프트와 같은 게임은 이 방식이 좋지 않다는 인식이 있지만 당장에 팀 포트리스 2와 오버워치를 위시한 카툰풍 혹은 이른바 픽사 애니메이션 느낌의 화풍을 지닌 게임에서는 노멀 매핑 또한 사실상 필수적이다.
노멀 맵은 원경에서 물체를 바라봤을 때에는 제법 그럴싸한 셰이딩을 보여주지만 근거리에서 시점을 돌려가면서 관찰하면 그저 종이 한 장 붙여놓은 듯한 단순한 음영과 질감이 드러나는 한계가 있다. 진짜로 입체감을 주려면 실제로 폴리곤이 많아야 하는데 DirectX 11부터 가능한 테셀레이션(Tesselation)과 디스플레이스먼트 매핑(Displacement Mapping)이라는 방법이 있다. 테셀레이션은 폴리곤의 면을 쪼개어서 더 많은 폴리곤으로 분할해 주는 기법이고 디스플레이스먼트 매핑은 하이트 맵 이미지를 기반으로 실제로 폴리곤의 높낮이를 조절해서 입체감을 만들어 낸다. 이것은 엄청난 연산량을 필요로 하기에 현시점에서는 부분적으로만 사용된다. 테셀레이션과 디스플레이스먼트 매핑은 실제로 폴리곤을 변화시키는 기술로서 노멀 매핑과 같은 텍스처 매핑 계열은 아니나 이 폴리곤의 양감을 계산하는데에 있어서는 엄연히 비트맵을 사용하기 때문에 단순히 그래픽 표현에만 집중하는 개발자라면 아래의 시차 매핑 혹은 범프 매핑[11]과 비슷한 방식으로 접근하면 된다.
노멀 매핑의 한계를 극복하기 위한 기법으로 노멀 매핑과 함께 쓰이는 시차 매핑(Parallax Mapping), 시차 가려짐 매핑(Parallax Occlusion Mapping, POM) 등이 있다. 그러나 이런 매핑 기법들 역시 텍스처 이미지를 왜곡하는 방법으로 입체감을 주는 것에 지나지 않는다. 각종 텍스처 매핑 자체가 이미지에 기반한 것이기 때문에 가까이서 이리저리 돌려보면 그 자체가 평면인 것은 구조상 어쩔 수 없다. 시차 가려짐 매핑(POM)은 구현하기에 따라 어지간히 집요하게 관찰하지 않는 이상 구별이 불가능한 수준이 가능하지만, 그러면 성능이 개박살나기 때문에 그렇게까지 쓰는 게임은 없다.[12]
이러한 시차 매핑 관련 기술들은 실제 폴리곤 수가 늘어나지는 않지만 폴리곤이 늘어난 것처럼 보이는 것에서 유래한 명칭으로 가상 디스플레이스먼트 매핑(Virtual Displacement Mapping)이라고도 불린다.:
7. 노멀맵의 종류
7.1. Tangent Space
Tanget는 해석 기하학에서 다루는 접선을 바탕으로 사용하는 방식이다. 각 면의 접선을 바탕으로 계산되고 "특징" 문단에서 언급 되었듯이 3차원 평면에서 Z 축은 면의 법선이며 RGB 채널의 B에 위치하기 때문에 푸른 빛을 띄게 된다. 이러한 특징으로 Z축을 생략하는 것이 가능해 텍스처화 시키는 경우 2채널만 저장하는 방식으로 압축하거나 다른 매핑의 목적으로 사용하기도 한다.7.2. World/Object Space
World Space와 Object Space는 기준점을 World Axis로 잡는것과 Object Axis를 기준으로 잡는지의 차이일 뿐 원리는 동일하다. Tangent Space가 면의 접선을 바탕으로 하는 것에 비해 오브젝트 전체를 바탕으로 각 면의 절대적인 방향이 향한 축을 사용한다. 이 때문에 Tangent 모델과 달리 로우 폴리 모델이 원본과 판이하게 다르고 훨씬 적은 수의 폴리곤을 가졌더라도 그럴싸한 음영 표현이 되지만 반대로 스키닝된 모델과 같이 변형이 일어나는 환경에서는 부적절하다.8. 여담
MS 계열인 DirectX/Direct3D 가 사용하는 좌표계와 크로노스 그룹 계열의 OpenGL, Vulkan(API)의 좌표계가 다르듯이 노멀 매핑 또한 좌표계가 다르다.보통 데이터 저장 편의상 RGB 채널에 각각 XYZ 좌표계를 넣어서 사용하는 식으로 사용되는데 이 때문에 3ds Max와 같이 DirectX를 사용하는 저작 도구들과 OpenGL을 사용하는 Autodesk Maya, Blender와 같은 소프트웨어들 또한 좌표계를 처리하는데서 호환되지 않아 서로 각기 다른 소프트웨어로 Bake 한 노말맵은 Y의 방향을 반대로 뒤집어 줘야 한다. (X,Y, Z) -> (X, -Y, Z). Tangent 기반 노멀맵의 경우 Y 채널만 뒤집어 주면 되지만 Object방식이나 World 방식의 경우 소프트웨어마다 제각각이다.
9. 관련 문서
[1] 배경과 모델의 경계면을 자세히 본다면 하이폴리곤으로 묘사한 곡선이 아닌 직선으로 표현된 로우폴리곤임을 알 수 있다. 또한 이 작품은 64비트 컬러 기반 HDR 렌더링에 디퓨즈, 블룸 등의 각종 포스트 이펙트가 적용된 최종 결과물임에 유의해야 한다. 단순히 폴리곤 수가 비슷하다고 기술 수준을 단정할 수는 없다.[2] 그래서 2000년 이전 3D게임을 홍보를 할 때 캐릭터의 폴리곤 숫자가 반드시 들어갔다.[3] 아래에 나오는 부서진 돌기둥의 하이 폴리곤 형태가 100만 폴리곤이 조금 넘는 수준이다. 노멀 맵 기술이 없었다면 저 정도 퀄리티의 오브젝트를 게임에 넣는다는 건 상상조차 할 수 없는 일이다.[4] 텍스처 옵션의 세부 옵션으로 노멀 맵 옵션이 따로 있었고, 사양상 무조건 풀 옵션이나 최하옵이 들어가는 경우를 빼면, 기본적으로 노멀 맵 옵션이 텍스처 옵션보다 한 단계 낮은 옵션으로 자동 설정된다.[5] 보통 추가적인 음영을 넣거나, 워썬더와 같이 위장의 마모를 자연스럽게 표현하기 위한 정보로 활용된다.[6] 하이 폴리곤 모델과 거기에서 리토폴로지를 진행한 로우 폴리곤 모델을 동일한 위치에 둔 뒤, 그대로 압착시켜 하이 폴리곤 형태를 로우 폴리곤 위에 찍어내는 느낌이라고 보면 쉽다. 이를 베이크(bake)라고도 부른다. 말 그대로 구워내는 것이다.[7] 말도 안 되는 방법 같지만, 의외로 단순한 노멀 맵 형태 또는 작은 파츠의 일부 같은 경우 실무에서도 이런 식으로 진행하기도 한다. 그럴싸하게 보이기만 하면 되는 것이기도 하고, 정말 미세한 부분을 조정하기 위해 하이폴을 다시 꺼내 수정하고 다시 굽는 것보다 훨씬 간단하기 때문이다.[8] 그러나 각도에 따라 새로운 그림을 뽑아내는 등 계산이 복잡한 만큼 사양이 높고, 높이값을 기반으로 계산하는지라 옆면의 디테일 표현은 될 리가 없으므로 옆면이 마치 층층이 쌓여 보이는듯한 '팬케이크 현상' 때문에 추가적인 필터링도 필요로 하는 등 노멀 맵에 비해 여러모로 까다로운 편이다.[9] 그러나 고퀄리티의 모델을 베이스로 채도를 없애 회색으로 만든 노멀 맵이나 상술한 AO, Cavity 맵 등을 기본적인 색깔구성인 디퓨즈에 합성하여 양감을 내고 후처리하는 식으로 제작하기도 하는 등이 있다. 직접 들어가지 않을 뿐이지, '손맵'을 만드는데도 노멀 맵을 적극 활용하기도 한다.[10] ZBrush가 아닌 다른 방식으로 하이 폴리곤 모델링을 한 후에 맥스에서 노멀 맵을 추출하면 이런 현상을 줄일 수 있다. 하드 서페이스(기계, 메카닉 등) 작업을 할 때 유용하지만, 대신 로우 폴리곤을 사용하는 시간적 장점을 희석시킨다.[11] 노멀맵 이미지가 아니라 무채색으로 이루어진 예전 방식의 범프맵을 말하는 것이다. 다만 범프맵도 그냥 쓰면(특히 검은색과 흰색의 영역이 칼같이 떨어진다면) 표현이 어색해지기 때문에 보통 블러를 적당히 주기는 해야한다.[12] 공개된 유일한 사례가, ATI에서 TeraScale 발표 초기에 하드웨어 테셀레이션을 통한 극적인 프레임 향상을 시연하기 위해, 하드웨어 테셀레이션 수준의 디스플레이스먼트 매핑을 억지로 구현해서 프레임이 박살 난 걸 먼저 보여주는 희생양 용도로 구현한 것이라고 봐야 될 정도.#