[ 게임 개발 ] Normal 벡터, Normal Map은 무엇일까
Normal벡터를 알고 있는가?
평범함, 보통을 의미하는 Normal이 아닌 조금 더 수학과 게임 개발에 관련된 개념이라 볼 수 있다.
Normal은 국산말로 법선이라고 한다.
법선? 물리나 기하학 혹은 선형 대수학을 공부해 보았다면 기억에 남을 수도 있다.
쉽게 설명하자면 어떤 면이 바라보고 있는, 즉 평면에 수직인 벡터를 의미한다.
꽤 익숙하지 않은가? 물리시간에 했던 입사각, 반사각사이의 법선이라는 개념이 존재하는데
이 법선과 같은 것이다.
Blender에서 노말벡터를 Gizmos로 그려주는 기능이 있는데 이것으로 정육면체를 보면
이런 식으로 표시된다.
이 면에 대한 Normal은 외적을 통해 구할 수 있는데.
삼각형을 나누고 각 삼각형에서 두 벡터를 만들어 외적을 해주면 그 삼각형에 대한 Normal이 나온다.
그렇게 나온 두 Normal을 평균 내어주면 이 쿼드 면에 대한 Normal값이 나오게 된다.
기본적인 Normal벡터의 의미는 이런 것이고
정확히 Normal벡터의 종류에는 두 종류가 있다.
위와 같이 면을 표현하는 Face Normal이 있고, 버텍스가 가지고 있는 Vertex Normal이 있다.
버텍스 노멀은 인접한 Face Normal의 평균을 통해 연산된다.
버텍스 노멀이 따로 존재하는 이유에는 여러 가지가 있는데
그중 대표적인 것이 모델의 스무딩 조절이 있다.
이와 같이 각진 모델링의 버텍스 노멀을 이용해 표면을 부드럽게 만드는 작업에 쓰인다.
위의 작업을 여러 번 반복해서 거치면 거의 폴리곤들의 경계가 사라지고 곡면처럼 보이는 효과를 보여준다.
게임개발에서는 오브젝트의 명암효과 연산에 Normal벡터가 활용된다.
모델의 면의 방향에 따른 빛의 반사 굴절 등등을 연산하는 데 사용되는데.
만약 이런 돌바닥을 표현하고 싶다면 어떻게 해야 할까?
돌바닥의 약간씩 울퉁불퉁한 저런 질감들 전부 모델링하는 걸까? 그렇지 않다.
만약 저걸 하나하나 버텍스로 만들었다면 그 게임은 바닥하나만 깔아놔도 성능이 떨어질 것이다.
인간은 언제나 꼼수를 찾는다. 바닥은 일반적인 쿼드 바닥으로 구성하고 명암효과에 활용하는
Normal 벡터에 대한 정보만 다른 정보로 바꿔치기해 준다.
무슨 소리냐 하면
이런 식으로 아주 평범하게 생긴 로우 폴리 판때기를 가져다 놓고
이런 식으로 임의로 Normal 벡터를 조정한 벡터 Map을 만들어 렌더링 과정에 끼워주면.
오브젝트 고유의 Normal에 조정된 Normal값을 더하여 빛 연산을 진행한다.
이렇게 해준다면 적은 버텍스로도 정교하고 자잘한 질감과 입체감을 표현할 수 있게 된다!
이런 식으로 벡터를 Color로 표현할 수 있다.
RGB를 각각 Vector3 x, y, z에 대입하여 컬러맵을 만들어주면 Normal맵이 된다.
단. 컬러에 음수는 존재하지 않기 때문에 좌표상의 0을 컬러의 128 값으로 가진다.
따라서 일반 Normal이 (0, 0, 1) 임에도 완전한 Blue가 아닌 이유는 컬러상으로 RGB(128, 128, 255) 이기 때문이다.
대충 이런 기법이 있고 이를 통해 게임을 최적화하는구나,라고 알면 될 듯하다.
다들 오늘도 멋진 게임개발하기 바란다.