WinCNT

법선 매핑(Normal Mapping) 본문

게임 프로그래밍(학습 내용 정리)/게임 수학

법선 매핑(Normal Mapping)

WinCNT_SSS 2022. 3. 22. 14:50

조명 처리 - 램버트의 코사인 법칙

Diffuse(확산광)

Light 중에서도 Diffuse(확산광)시점과 무관하게 빛이 퍼져있는 것을 말한다

Nomal 벡터와 Light 벡터를 내적하면 구할 수 있다

※시점과 연관이 있는 Light는 반사광이라고 한다

확산광을 버텍스 셰이더에서 연산하면 폴리곤 단위로 연산되므로 깍둑지는 현상이 발생한다

반면 픽셀 셰이더에서 연산을 하면 픽셀 단위로 연산되므로 깍둑지는 현상이 사라진다

현재(2022년)의 대부분의 게임은 픽셀 셰이더에서 확산광을 연산한다

법선 맵핑

노멀 벡터를 텍스처에 넣어보자!

텍스처의 RGB가 XYZ로 치환할 수 있기 때문에

RGB 벡터가 들어가 있는 텍스처 또한 만들 수 있다

 

노멀 맵 - RGB에 노멀 벡터가 들어가 있어서 붙여진 명칭

픽셀을 연산할 때 노멀 맵에서 벡터를 획득해서 N dot L를 연산함

 

중요!) 0~255의 값이 셰이더로 넘어오면 0~1의 실수(float) 값으로 바뀜

 

더욱 적은 폴리곤으로 더욱 정밀한 그래픽을 구현할 수 있기에

최근의 모든 게임에서는 모두 사용된다

 

하지만 노멀 맵을 사용하기 위해서는 그 전에 처리해야할 작업들이 있다

셰이더 연산을 할 때 절대적으로 지켜야 하는 원칙!

모든 벡터들은 동일한 (좌표)공간에 존재해야 한다

(동일하지 않은 (좌표)공간의 벡터들로 연산하면 쓰레기 값이 나옴)

 

노멀 맵의 노멀 벡터들은 탄젠트 스페이스에서 연산을 하도록 만들어짐

(노멀 맵은 아트 쪽에서 만들어진다)

즉, Light 연산을 할 때 라이트 벡터탄젠트 스페이스로 가져가서 연산을 해야 한다

혹은 반대로 탄젠트 스페이스의 값을 월드 공간으로 가져와야 한다

접선 공간(탄젠트 스페이스, Tangent Space)

탄젠트 스페이스의 다른 말은 버텍스 스페이스이며,

탄젠트는 기울기이기도 하며 접선이기도 하다

 

접선 공간은 버텍스에 접하는 3개의 축이 존재한다

Normal(Up)은 항상 1에 가깝기 때문에 노멀 맵은 파란색이 강하다

접선 공간을 사용하는 이유

오직 캐릭터 애니메이션 때문

Scale이 바뀌면 노멀 벡터가 바뀌는데

관절이 접히는 애니메이션은 관절 부위에 Scale이 발생한다

접선 공간 구하기

그람-슈미트 과정(그람-슈미트 단일직교화)

텍스처 응용

법선 매핑에서는 텍스처에 벡터 정보를 넣었다

다시 말해, 텍스처에는 RGB 값이 아니라 다양한 정보를 넣을 수 있다는 뜻이다

 

그 중 하나가 마스크

갑옷을 장착한 캐릭터를 렌더링할 때, 갑옷과 캐릭터의 피부 질감은 달라야 하지만

렌더링 코드를 분리하기에는 연산 비용이 비싸진다

그럴 때 텍스처에 마스크에 대한 정보를 저장해서,

갑옷과 캐릭터의 피부의 정보를 마스크할 수 있으면

각각 알맞은 질감을 줄 수 있을 것이다

 

SSS

'게임 프로그래밍(학습 내용 정리) > 게임 수학' 카테고리의 다른 글

Gamma Correction  (0) 2022.05.10
Matcap Texture  (0) 2022.04.05
셰이더  (0) 2022.03.08
Direct2D - 흑백 쉐이더 만들기  (0) 2022.01.19
PBR  (0) 2022.01.11