본문으로 바로가기

Unity Noraml Map 제작/적용 (1)

category Technical Report/Tutorials 2018. 4. 9. 02:07
반응형

Unity Normal Map 제작/적용 (2) : http://illu.tistory.com/1324
Unity Normal Map 제작/적용 (3) : http://illu.tistory.com/1326

 

Normal mapping은 이미 많이 알려진 기법으로 실제 리소스 제작에서 주의해야 할 부분에 대해서 알아본다.

우선 하이폴을 만든다. Zbrush를 사용하던 Mudbox를 사용하던 Hard surface modeling을 하던 방법은 상관없다.

 

로우폴은 토폴로지를 하던 그냥 만들던가 하면 된다. 여기서는 빠르게 제작하기 위해 로폴 >> 지브러쉬 스컬핑 >> 하이폴 맥스 임포트 후 바로 Normal texture를 뽑는 방식으로 진행했다.

로우 폴리곤 모델을 뽑느다. 이 과정을 리토폴로지라고 한다.(3D Coat같은거 써도 되고... 요새 마야도 툴 좋더라...)

100만개가 조금 넘기 때문에 속도가 괜찮은데 천만개, 억단위로 가면 뷰포트가 엄청 느려진다. 이 경우 파트별로 쪼개서 각각 뽑는 방법도 있다.

Max에 import한 하이폴은 로폴 모델링과 정확히 겹치게 배치한다.(처음부터 좌표를 0,0,0에 고정해서 작업해야 이걸 맞추는 수고를 덜 수 있다) 겹침을 확인하기 위해 alt+X 를 눌러 반투명으로 보통 확인한다.

render to texture 메뉴를 불러와서 Output Path(맨위 붉은 박스)에 생성된 텍스쳐가 저장될 경로를 지정한다.(렌더된 화면의 텍스쳐를 사용하는게 아니다)

그리고 Projection Menu의 Pick을 선택해 하이폴을 선택해주면 저렇게 파란색의 cage가 나타난다.

아래 output에서 Use Existing Channel로 로폴의 UV 채널을 선택해준다.(기본은 1번채널이다. UV는 지블에서 마스킹으로 패턴 넣으려고 미리 만들어서 내보냈다.)

그리고 아래 Add를 눌러 NormalMap을 선택하고 아래 texture size를 설정해준다.

Modifier에서 Projection을 수정할수 있는데 테스트할 메쉬는 겹치는 부분이 적어서 크게 문제가 안되지만 복잡한 메쉬의 경우에는 Cage를 수정해줘야 노멀맵이 잘 나온다. 우선 ResetAmout값을 조절해 적당히 오브젝트를 감싸는 형태로 조절해준다.

케이지를 수정한 모습.

 

분수 에셋 만들때 장식용으로 제작된 독수리 머리 상
노멀맵은 큰 쉐입을 만들기보다 위와 같이 적은 메시에 디테일한 쉐입을 추가한다라는 느낌으로 작업하는 용도로 쓰면 효과가 좋다. 특히 배경에서는~


복잡한 Cage 작업은 Render to texture >> Cage 수정 >> Reder to texture의 반복 작업이다. 제대로 Projection이 안되는 영역은 붉은색으로 렌더되는게 보인다. 요령은 sampling 수치를 조절하는등 퀄업은 나중에 하고 우선 제대로 뽑히는지 확인하고 퀄을 올리는게 빠르다.

노이즈가 심하다면 Renderer에서 옵션을 조절하면 렌더시간은 좀 더 걸리지만 좋은 품질의 텍스쳐를 얻을 수 있다. Mental Ray일때와 Scanline일때가 다르다. 이와 관련한 팁은 인터넷에 많으니 패스~

노멀 텍스쳐 생성 알고리즘은 노멀 텍스쳐 위로 하이폴 메쉬의 노멀 방향을 텍스쳐로 매핑(bake)하는 과정이다. 주의할 점은 cage가 로폴 하이폴 보다는 위에 있어야 하고 Cage 위치가 최대한 겹치지 않아야 한다는 것이다.

특히 Smoothing Group을 그냥 모두 1로 묶어서 뽑는경우가 많은데 그럴경우 면의 꺾임이 클 경우에 노멀맵이 제대로 생성되지 않는다. 그래픽스에서 면의 방향은 Vertex Normal로 읽게 된다.

즉 오른쪽처럼 Smoothing Group을 모두 하나로 묶은 경우에는 바라보는 면의 실제 방향은

저렇게 곡선으로 인식하고 있다는 말이 된다. (아랫부분 시커멓게 ambient color가 맺히는게 괜히 저렇게 나오는게 아니다)

엣지에 chamber를 줘서 면을 분할해서 Smoothing Group을 하나로 묶어도 되지만 폴리곤이 늘어나는데다 저렇게 해도 vertex normal 방향이 실제 면과 정확하게 일치하지는 않는다. 다만, 어차피 노멀 맵핑이라는게 실제 폴리곤을 만들어 주는게 아니기에 형태에서 디테일을 주기위해 추가하는건 몰라도 스무싱 때문에 면 추가하는건 정말 삽질이다.(UV정리가 좀 더 귀찮아 지는건 덤...)

자 이제 Unity로 가져온다. FBX export 옵션에서 Smoothing Group 체크는 필수. 아래 FBX 옵션들이 어떤 역할을 하는지 살펴보자. (양 얼마 안많다. 한번 읽어두면 피가되고 살이 되니 모르면 읽자 !)

FBX Export Option : http://illu.tistory.com/1175

자 이제 Unity에 들고오면 잘 나오는거 같은데........

엣지 Seam라인에 줄이가고 오브젝트를 돌려보면 노멀이 뒤집힌게 보인다.

이는 OpenGL 기반의 Unity와 DirectX 기반의 3DS MAX의 Graphics API 차이로 발생하는 문제로

Blender, Maya, Modo, Unity등은 3DS MAX와 G채널이 반대값을 가진다.(왜그러냐 따지지 말자... 크로노스랑 마소랑 맞짱떠서 이기는 편 대로 통일하면 속편하겠지만... 아니 그전에 같은회사 MAX랑 MAYA도 반대인걸...)

유명한 트윗이다. 나 그땐 어렸었다고 !!!

포토샵에서 G채널을 선택해서 Ctrl+I로 반전시켜주면

정확하게 나온다. 여담으로 모서리 꺾임에 파인 부분의 디테일을 올릴려면

그냥 Cut으로 면을 잘라준 상태로 Normal맵 뽑는쪽이 훨씬 그럴싸하게 나온다. (부서진 폐허 같은거 만들때 효율적이다)

케릭터 모델링의 경우에는 인체는 보통 smoothing group을 하나로 묶는 경우가 많지만 갑주같은 경우 이렇게 Smoothing group을 정리해주는게 적은 폴리로 효율적인 모델링이 가능하다. 특히 배경쪽은 로폴리곤이 픽셀에 차지하는 면적이 크기 때문에 이런경우에 티가 더 잘난다.

왼쪽이 Smoothing group을 모두 1로 잡아서 만든 Normal Texture를 사용한 오브젝트. 빛 계산이 틀어진게 확연히 보인다. Mesh Smoothing group은 둘다 면 꺾임에 따라 나뉜 상태

왼쪽이 Smoothing group을 나누어서 뽑은 Normal Texture | 오른쪽이 모두 하나로 묶어서 뽑은 Normal Texture

그럼 오른쪽 노멀텍스쳐에 Smoothing group을 모두 하나로 묶은 메쉬를 적용하면 ?

 

@..@


그럴싸하게 나온다.... 만.... 자세히 보면 미세하게 빛 반사가 틀어진게 보인다.

이는 하나로 묶인 Smoothing group에 하이폴이 Projection되어 나오기 때문에 크게 틀어진 게 없어 보이지만...

 

 

Lightmap을 구워보게 되면 Vertex normal을 기준으로 게산하므로 위와 같은 결과가 나타난다.

 

특히 버텍스가 적은 영역에서는 이러한 틀어짐이 더 두드러지게 보인다.

To be Continued...

Unity Normal Map 제작/적용 (2) : http://illu.tistory.com/1324

Unity Normal Map 제작/적용 (3) : http://illu.tistory.com/1326

반응형