--------------------
노말맵이란?
--------------------
노말맵(normal map)이란 다른 말로 노말범프맵(normal bump map)이라고도 하며, 메쉬
표면의 노말벡터를 텍스쳐 파일에 저장?놓은 것을 뜻합니다. 노말맵에는 오브젝트
공간 노말맵(object space normal map)과 탄젠트 공간 노말맵(tangent space normal
map)이 있습니다. 오브젝트 공간 노말맵은 말그대로 오브젝트의 좌표계 상에서의
노말을 담는 것이고, 탄젠트 공간 노말맵은 노말 벡터를 텍스쳐 좌표계에 대하여 구한
다음 저장한 것입니다. 따라서, 탄젠트 공간 노말맵은 다른 말로 텍스쳐 공간
노말맵(texture space normal map)이라고도 부릅니다.
--------------------
오브젝트 공간 노말맵과 탄젠트 공간 노말맵의 차이점
--------------------
앞서 말했듯이 오브젝트 공간 노말맵과 탄젠트 공간 노말맵은 서로 노말벡터의 기준
좌표계가 다른 것입니다. 오브젝트 공간 노말맵의 장점은 구현하기가 쉽고, 로우
폴리곤의 경우에도 라이팅의 선형성이 거의 나타나지 않아 외곽 실루엣을 제외하면
하이 폴리곤과 동일한 효과를 나타낼 수 있다는 장점이 있습니다. 하지만, 모든 노말
벡터가 오브젝트 공간을 기준으로 되어 있기 때문에 캐릭터에 적용시 스키닝이
간단하지 않은 단점이 있습니다. 이에 반해 탄젠트 공간 노말맵은 각 폴리곤의
텍스쳐 좌표계를 기준으로 노말벡터가 계산되어 있기 때문에 스키닝이 되어도 그대로
적용할 수 있다는 장점이 있습니다. 따라서, 너무 로우 폴리곤이어서 라이팅의
선형성이 눈에 많이 띄는 경우가 아니라면, 탄젠트 공간 노말맵을 사용하는 것이 더
편할 것입니다(저의 추측임)
--------------------
노말맵 작업시 유의 사항
--------------------
1. 인접한 삼각형의 텍스쳐 공간 노말 벡터의 방향이 반대인 경우.
: 이 경우는 디자이너가 메시를 언랩할 때, 삼각형 구성 방향이 반대로 되지 않도록
적절히 작업해주면 해결되지만, 디자이너가 신경쓰지 않도록 하려면, 노말 벡터를
구할 때 인접 폴리곤의 텍스쳐 공간 법선 방향이 반대인 경우에는 제외시키는
방식으로 별도 처리해 주셔야 할 겁니다.
2. 서로 다른 폴리곤의 텍스쳐 좌표 공유
: 노말맵의 큰 단점으로 서로 다른 폴리곤(서로 다른 노말을 가진)들이 동일한
텍스쳐 좌표를 사용할 경우, 한 쪽 폴리곤에 대해 반대 방향으로 노말맵이 적용되는
경우가 발생합니다. 예를 들면, 오른쪽 다리와 왼쪽 다리에 대해 노말맵 텍스쳐를
공유할 수 없다는 거죠. 디퓨즈 텍스쳐 좌표와 노말맵 텍스쳐 좌표를 동일하게 쓰는
일반적인 경우라면, 캐릭터의 좌우 텍스쳐를 공유하지 못하고 전부 텍스쳐에
표현해야 한다는 단점이 있습니다. 물론, 얼굴 텍스쳐도 마찬가지지요.
3. 폴리곤이 너무 큰 경우
: 폴리곤이 너무 적거나 다른 폴리곤들에 비해 너무 큰 경우에는 라이팅 자체가
선형적으로 드러날 수 있기 때문에, 노말맵을 적용한 효과가 아주 미비할 수
있습니다. 이 경우에는 폴리곤을 적당한 수준으로 쪼개 주거나 이라디언스맵등을
활용하는 방법을 생각해 볼 수 있겠습니다.
--------------------
관련 사이트
--------------------
http://msdn.microsoft.com/library/en-us/dndrive/html/Directx11192001.asp
: MSDN에 있는 Philip Taylor의 Per-Pixel 라이팅 기초 문서. 개념과 예제를 쉽게
설명하고 있다. 필독 요망. 혹시 마법의 탄젠트 공식(magic tangent equation)이
잘 이해가 안 간다면, 아래의 그림이 도움이 될 지도.
http://zho.pe.kr/doc/magic_tangent_equation.jpg
http://mirror.ati.com/developer/normalmapper.zip
: ATI에서 만든 커맨드 라인 노말맹 생성기. 노말맵을 위한 로우&하이 폴리곤은
플러그인(소스까지 공개)을 사용하여 익스포트할 수 있다. 소스까지 공개되어
있으며, 오브젝트 공간 노말맵 및 탄젠트 공간 노말맵을 모두 생성할 수 있다.
http://sparks.discreet.com/downloads/downloadshome.cfm
: Normal Map Rendering Utility for 3ds max 4.x and 3ds max 5
3ds max용 노말맵 생성기. 소스는 없는 공개용이며, 로우 및 하이 폴리곤을
사용하여 탄젠트 공간 노말맵을 생성시켜 준다. 단, 하이 폴리곤에도 텍스쳐 좌표가
있어야 한다는 단점이 있다.
http://www.3dkingdoms.com/tutorial.htm
: OpenGL 예제로 캐릭터 스키닝도 되는 오브젝트 공간 노말맵 구현 튜토리얼.
레지스터 컴바이너를 사용하는 예로 설명하고 있으나, 버텍스 쉐이더는 사용하지
않음.
http://www.crytek.de/polybump/index.php?lang=eng&sx=polybump
: crytek 사의 폴리범프 플러그인. 3ds max에서 로우 폴리곤과 하이 폴리곤을
사용하여 노말맵을 생성해 준다. 단, 상용이라 사용에 제한이 있으며, 텍스쳐에
로고가 찍혀 나오므로 테스트만 해볼 수 있는 수준이다.
http://www.nvidia.com
: nVidia사의 각종 per-pixel lighting 관련 문서들.
노말맵에 대하여...
1 메쉬값이란 어떤 것을 이야기하는지..
: 노멀맵이란 이해하고 계신대로 하이 폴리곤 모델의 느낌을 로우 폴리에 적용하는 개념입니다.
정확하게 말하면 하이 퀄리티 모델링이 가지고 있는 폴리곤당 노멀(normal) 정보를 텍스처 데이터로 추출을 하고 이것을 다시 로우한 모델링에 기존의 diffuse map(color map)과 함께 적용시키는 개념입니다. 그렇기 때문에 메쉬값이라는 말은 디테일한 하이폴리 모델링의 노멀 정보 값이라고 이해하시면 됩니다.
실제로 노멀값은 단위 폴리곤이 가지고 있는 법선 방향 값이라는 것을 알고 계실 겁니다.(3디 소프트웨어에서 view normal같은 옵션을 켜주면 폴리곤의 면의 방향과 그 방향으로 선 같은 것들이 나타나지요..^^;) 이 노멀 값은 기본적으로 라이트에 반응을 하게 되는게 면과 수직인 방향에 조명이 있으면 가장 밝은 색을 나타내게 되고 면과 평행선에 가까워지면 질수록 어두운 색을 나타내게 됩니다. 그리고 완전히 조명이 면 뒤로 가면 아주 어두어지게 되죠 이는 마치 해가 지면 지면이 어두워지는 것과 같은 개념입니다.
(일반적인 렌더링의 경우 빛에 대해서 반응하는 것이 폴리곤면 그 자체이지만 리얼타임 게임 엔진의 경우는 일차적으로는 버텍스 단위(vertext shading)로 빛에 대한 반응을 하게 됩니다.)
노멀맵은 한 오브젝트에 포함되어 있는 모든 폴리곤의 노멀 방향에 대한 정보를 월드축에 기준으로 해서 텍스처로 저장을 합니다. 당연히 이경우에는 오브젝트에 미리 UV가 최적으로 적용되고 edit되어 있어야 할 것입니다. 월드축에 대한 방향 정보는 일종의 directional light의 색으로 표현이 되며 이 색은 임으로 정할 수 있습니다.(둠3 관련 내용을 보다보면 보라색 같기도 한 것이 이상 야릇한 텍스처가 있는게 그게 노멀 맵이고 라이트 색의 정보가 저장된거라고 보시면 됩니다.)
좀 정확하게 설명하자면 x, y, z, -x, -y, -z의 각 방향에서 노멀맵을 추출하고자 하는 오브젝트에 수직으로 빛을 비추고 이를 마야에서는 convert to texture file 맥스에서는 recder to texture이라는 개념으로 라이팅이 적용된 텍스처를 뽑아내게 되면 그게 개념적으로는 노멀맵을 추출한 것입니다. 마야에서는 마야가 지원하는 쉐이딩과 임의의 라이트 색에 의해 노멀 맵을 추출 할 수 있고 맥스는 dicreet 사에서 지원하는 Normal Map Rendering Utility를 이용해서 노멀 맵을 아주 쉽게 추출 할 수 있습니다.(맥스의 방법을 추천합니다.^^)
( http://sparks.discreet.com/downloads/ 이곳에 가면 다운로드 받을 수 있습니다.)
노멀맵 테스트
: 맥스의 Normal Map Rendering Utility를 사용하시면 되는데 사용 방법은 그 안에 사용 설명서가 있습니다. 그것을 참조하시면 되고요 ^^; (영어 입니다….^^ 차근 차근히 읽어보세요…)
우선 확인하시기 전에 맥스는 Direct x 모드로 전환을 하셔야 합니다. 물론 지금 설정이 되어 있으면 상관이 없구요 이를 확인 하시려면
맥스의 주 매뉴의 Customize/preference/viewports/choose driver안에서 선택하시면 됩니다.
그래서 맥스를 실행하고 Material Editor 안에보면 맨 아래 부분에 Viewport Manager이라는 부분이 생기구요 그안 서브 매뉴를 보면 Metal bump라고 있지요 그안에 보면 노멀맵, 환경 맵의 패스를 지정해주는 곳이 있는데 여기에다 작업 하신 노멀 맵을 넣어주면 리얼타임으로 게임 엔진에서 보는 것과 같은 퀄리티의 이미지를 실시간으로 확인하실 수 있습니디다 특히 라이트를 만드셔서 오브젝트 좌우로 움직여 주면 아주 죽음이죠..^^ 물론 라이트 맵이라든가 반사맵(환경맵)도 확인할 수 있습니다.
노멀맵 작업시 유의 사항(리얼타임 엔진 관련)
: 모델링 및 UV 관련
철저하게 2개의 모델링이 제작되어야 합니다. 제작하는 방법은 하이 모델링을 텍스처 UV 값을 유지한채 로우로 바꾸거나 로우한 모델링을 마찬가지로 UV를 유지하면서 하이 모델링으로 퀄리티를 올리는 방법을 선택할 수 있는데 원하는 작업 목적과 퀄리티와 성격에 따라 방법은 편한대로 설정할 수 있을 것이라고 봅니다.
폴리곤 모델링 방법도 명확해야 합니다. 맥스의 경우는 editable poly에서 작업을 해야 할 것이고 마야는 디폴트가 다각형 폴리곤 기반이기 때문에 크게 상관 없습니다.
vertex을 merge 하거나 혹은 edge를 지우거나 넣어 주어도 UV가 유지되는 개념이 기본이 되어야 할 것입니다.(모델링을 디테일하게 하거나 혹은 로우하게 만들 때 UV의 전체 구조가 손상이되서는 안됩니다. 당연히 edge를 날렸는데 면이 날라가는 상황도 절대 있어서는 안되죠 개인적으로 마야 폴리곤 모델링을 추천합니다.)
아무튼 제일 중요한 부분은 반드시 하이 퀄리티리 모델과 적용하려고 하는 로우퀄리티 모델의 UV 좌표 정보가 통일해야 한다는 것인데 물론 동일하다는 개념은 UV의 구역과 방향 그리고 특히 단위 UV의 외곽 부분(UV border)이 유지되어야 한다는 것입니다. 외곽이 아닌 내부의 UV 디테일은 다를 수 있습니다)
: 노멀 맵의 사이즈
노멀 맵의 사이즈에 따라 차후 빛에 대해서 반응하는 디테일이 조정이 됩니다.
: 노멀 맵 적용시 diffuse 맵 작업 방식
노멀 맵을 적용할 경우 기존의 텍스처 제작 방식과는 큰 차이가 있습니다. 그 가장 큰 차이는 절대 텍스처에 그림자가 들어가서는 안된다는 것입니다. 개념적으로는 비주얼 작업할 때와 똑같이 작업을 해야한다고 봐야겠죠.
기존의 게임 텍스처 작업은 캐릭터의 모양에 따라 그림자를 텍스처에 넣어 주었지만 노멀맵을 적용할 경우 라이트에 따라 실시간 혹은 렌더링시 부드러운 명암이 생기게 됩니다. 따라서 만일 컬러 텍스처에 그림자를 넣어주게 되면 어두은 부분은 너무 어둡게 되는 결과를 가져오게 됩니다.
: 추가적인 맵 적용
노멀 맵과 사용할 수 있는 맵으로 보면 범프맵(bump map), 스펙큘러 맵(specular map), 환경맵(reflection map) 등인데 이것은 거의 비주얼 제작 개념과 동일한 형식을 취하고 있습니다. 물론 이것을 동시에 쓰면 장난이 아닌 부하를 유발 시킵니다.^^;
: 노멀 맵이 적용될 수 있는 효과적인 부분
모멀맵은 단순히 캐릭터에 적용될 수 도 있지만 배경에 적용하면 정말 엄청난 퀄리티를 리얼타임으로 제작할 수 있습니다. 예를 들어 벽돌로 된 벽이나 벽에 있는 부조등을 표현할 때 소스 모델이 1백만 폴리곤이라도 몇 백개의 폴리곤으로만으로 제작을 할 수 도 있습니다.
대신 노멀맵의 사용은 부익부 빈익빈이라는 개념으로 설명되기도 하는데 어느정도의 하드웨어 스펙이 되지 않으면 돌아가지도 않게 되는 것이 하드웨어 스펙이 그 이상이 되게 되면 상대적으로 엄청한 퀄리티를 실시간으로 확인할 수 있다는 것을 빗대어 얘기한 거란 생각이 듭니다.
노멀맵은 좋은 퀄리티를 지원하는 만큼 적지 않은 부하를 유발 시키기 때문에 제한적으로 사용하거나 최대치를 요구하는 옵션으로 적용하는 것이 좋을 것 같습니다.
정리
약간은 실시간 게임 엔진 위주로 개념을 정리해 보았습니다. 하지만 이번 E3에서 시연된 언리얼 3엔진에서 제시하는 바와 같이 앞으로 실시간 렌더링 기술은 비약적으로 발전을 할 것이고 나중에는 영화 쪽의 극 사실적인 렌더링 기술을 제외한 다양한 부분(게임, 비주얼, 애니메이션)에 실시간 렌더링으로 기존의 렌더링 개념이 아닌 화면 프레임별 스샷이라는 개념으로 변환될 가능성도 느끼고 있습니다.
그렇기 때문에 개념적으로는 노멀 맵은 리얼 타임과 비주얼에 동일하게 적용되는 개념이라고 볼 수 있습니다.
-------------------------------------------------------------------------
노말맵 사용법
노말맵 사용법(게임에서 범프 대신 사용 하는맵)
맥스 플러그인즈 방에 nomalrender.dlu
포토 샵 플러그 인즈 방에 nomalmapfilter.8bf
1. 맥스에서 작업
유틸리티/ 노말 렌더 실행
-Pick Source Mesh:고
-Pick target Mesh : 저
Size 지정
File 저장
Redering: 노말맵 나옴
주의점" 맵별로 떼어서 작업할것
2. 포토 샵에서 작업
Filter/Nvtools
scale 조절(512-3_
일반 디퓨즈 맵에 적용
3. 합성 (맥스에서 작업한 맵이랑 포샵에서 작업한 맵을 섞는다)
최종=맥스에서 뺀 노말맵이랑
포토 샵의 노말맵이랑 오버레이 한다
맥스에서 결과 물 보기
맥스 시행 전에 directx 모드로 바꾼다
메트리얼 에디터에서
메탈 범프를 선택 하여
ambient diffuse : 디퓨즈 맵넣기
범프맵 만든것 넣기
리플렉션 맵 넣기 dds files
리플렉션 맵 만들기
금속 재질 : 리플렉션 맵
-금속 그레이 어둡게 뺀다
나머지 블랙으로
사이즈 원래 사이즈의 절반
출처 : 네이버 블로그
'DirectX > 3D' 카테고리의 다른 글
DX 함수 참고사항 (0) | 2010.10.25 |
---|---|
파생 탄젠트 공간의 매트릭스 (0) | 2010.10.01 |
Max Export (0) | 2010.09.27 |
맥스플러그인을 위해서 우리가 반드시 알아야 할 것들을 한번 (0) | 2010.09.16 |
ASE 파서 파싱 (1) | 2010.07.27 |