빛도 구현했고 이제 텍스처를 씌워보자.
평평한 표면에 벽지를 바른듯 나무 무늬에서 입체감이 느껴지지 않는다. 그 이유는 각 면에서 노멀이 모두 균일하기 때문이다.
그럼 어떻게 해야 입체적으로 느낄 수 있을까?
단순하게 생각해보면 가운데와 같이 폴리곤을 아주 많이 쪼개는 방법이 있다. 하지만 이렇게 할 경우에는 처리할 연산이 너무나도 많아진다. 그래서 나온 것이 노말 매핑(normal mapping)이다.
Normal map
울퉁불퉁한 표면을 위해 노말들만 가져와 텍스처에 저장한 것이 노말 맵이다.
각 텍셀에 RGB 자료를 담는 것이 아니라 압축된 x, y, z 성분들을 각각 R, G, B 채널에 담는다는 점에서 보통의 텍스처와 다르다. 법선 벡터는 z축에 가깝기 때문에 xyz 성분을 RGB에 담는 노말맵(normal map)에서 푸르게 보이는 것이다.
노말 맵을 성분당 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 |