DirectX

법선 매핑(Normal Mapping)

Awesome Red Tomato 2022. 7. 15. 09:12

빛도 구현했고 이제 텍스처를 씌워보자.

 

평평한 표면에 벽지를 바른듯 나무 무늬에서 입체감이 느껴지지 않는다. 그 이유는 각 면에서 노멀이 모두 균일하기 때문이다.

균일한 노멀 벡터

그럼 어떻게 해야 입체적으로 느낄 수 있을까?

 

단순하게 생각해보면 가운데와 같이 폴리곤을 아주 많이 쪼개는 방법이 있다. 하지만 이렇게 할 경우에는 처리할 연산이 너무나도 많아진다. 그래서 나온 것이 노말 매핑(normal mapping)이다.

Houdini Docs

 

 

Normal map

울퉁불퉁한 표면을 위해 노말들만 가져와 텍스처에 저장한 것이 노말 맵이다. 

 

각 텍셀에 RGB 자료를 담는 것이 아니라 압축된 x, y, z 성분들을 각각 R, G, B 채널에 담는다는 점에서 보통의 텍스처와 다르다. 법선 벡터는 z축에 가깝기 때문에 xyz 성분을 RGB에 담는 노말맵(normal map)에서 푸르게 보이는 것이다.

https://3dtextures.me/
물방울 책에서 퍼옴

 

 

노말 맵을 성분당 8bit의 24bit 이미지 형식으로 저장한다고 치면, 각 성분은 [0, 255], 즉 1byte 값을 담을 수 있다. 그럼 하나의 단위벡터를 24bit 형식으로 압축하는 방법을 보자. 일단 벡터의 모든 성분은 [-1, 1] 구간에 속한다는 점에 주목할 필요가 있다. x가 [-1, 1] 구간의 한 좌표 성분일 때 f(x)는 아래와 같다.

 

 

반대로 압축을 해제하는 방법 즉, 좌표 성분을 다시 [-1, 1]로 만드는 방법은 위 함수의 역함수를 구하면 된다.

 

노말 맵을 우리가 압축해 만들 필요는 없다. 그냥 포토샵을 쓰면 된다. 하지만 픽셀 셰이더에서 노말 맵을 추출할 때에는 직접 압축해제를 해주어야 한다.

'DirectX' 카테고리의 다른 글

조명(Lighting)  (0) 2022.06.09
Transform  (0) 2022.05.23
7.6 루트 서명 추가 설명  (0) 2022.01.08
7.5 도형 예제  (0) 2022.01.06
7.4 도형 기하구조  (0) 2022.01.06