포스트

[ Graphics ] 노멀 매핑

노멀 매핑




(d)에서 노멀 $n$과 빛 벡터 $l$ 계산을 통해 a, b, c의 반사 정도를 결정한다.

  • b의 경우 $n$과 $l$ 사이 각도가 작아 빛을 많이 받아 밝게 보인다.
  • a와 c는 $n$과 $l$ 사이 각도가 커 빛을 적게 받고 어두워 보인다.

이를 통해 울퉁불퉁한 표면을 표현할 수 있으나, 폴리곤 메시가 많을수록 처리에 시간이 걸린다.



매끄러운 메시를 사용 시, 빛 벡터 $l$에 따라 밝기만 변하고, 울퉁불퉁한 표면을 표현할 수 없다.

이를 해결하는 방법 중 하나인 노멀맵(normal map)은 메시의 노멀을 미리 계산하고 텍스처에 저장하여, 라이팅에 사용한다. 이러한 텍스처링 기법을 노멀 매핑(normal mapping) 또는 범프 매핑(bump mapping)이라 부른다.


  • 하이트맵(height map) : 2차원 좌표(x, y)에 따라 높이(height) 혹은 z값을 반환 받아 일정한 간격의 (x, y) 좌표에서 샘플된 하이트 필드를 생성, 이러한 높이 값을 저장한 2차원 텍스처 (하이트맵은 원본 텍스처와 동일한 해상도)


높이 값에 따른 회색조(gray-scale)색상으로 출력 시 회색조 이미지로 그릴 수 있다. 색상이 비교적 일정할수록 상대적으로 매끈한 영역, 색상이 불규칙할수록 울퉁불퉁한 영역을 나타낸다.


이를 활용, 노멀을 계산하여 주변 표면의 경사도를 반영한 노멀맵을 생성한다.


정규화된 노멀 $(n_x, n_y, n_z)$의 각 좌표는 모두 $[-1, 1]$ 범위의 실수 값이고, 이를 텍스처에 저장하기 위해 $[0, 1]$ 범위로 변환한다.


노멀맵은 $n_z$가 $n_x$와 $n_y$에 비해 상대적으로 커, 파란 색조를 띄게 된다.



이를 적용 시, 매끄러운 메시에서 울퉁불퉁한 표면을 표현할 수 있다.



출처: OpenGL ES를 이용한 3차원 컴퓨터 그래픽스 입문

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.