본문 바로가기

공부/Open GL ES를 이용한 3차원 컴퓨터 그래픽스 입문

[Open GL ES를 이용한 3차원 컴퓨터 그래픽스 입문] 챕터 14 - 노멀 매핑 [1/2]

728x90
반응형

 

 

 

 

고해상도 메시의 불규칙한 노멀을 사용하여 오돌토돌한 표면을 렌더링함

 

  • (d)에서 세 개의 점 a, b, c에서의 디퓨즈 반사를 보면 이는 노멀 $n$과 빛 벡터 $l$에 의해 결정되는데, b의 경우 $n$과 $l$ 사이 각도가 작아서 빛을 많이 받아 밝게 보인다.
  • 하지만, a와 c는 $n$과 $l$ 사이 각도가 커서 빛을 적게 받고 어두워 보인다.

 

  • 표면 전체에 걸쳐 이처럼 노멀이 불규칙하게 변하므로, 표면 밝기도 불규칙하게 변해서 오돌토돌한 표면을 잘 표현해 준다.
  • 하지만 폴리곤 메시의 해상도가 너무 높은 고해상도 메시는 처리에 많은 시간이 소요된다.

 

 

 

매끄러운 메시에 이미지 텍스처만 적용하면 오돌토돌한 표면을 표현하기 어렵다.

 

  • 빠른 연산을 위해 삼각형 두 개로 구성된 메시를 사용하였지만, 이런 메시로는 오돌토돌한 표면을 잘 표현할 수 없다.
  • (d)를 보면 a에서 b를 거쳐 c로 갈 때, $n$과 $l$ 사이의 각도는 서서히 작아져서 점차 밝아보이게 된다.
  • 서서히 변화하는 표면 밝기로 인해서 표면의 오돌토돌한 특징이 드러나지 않게 된다.

 

  • 이러한 문제를 해결하기 위한 방법 중에 하나가 바로 고해상도 메시의 노멀을 미리 계산하고, 이를 노멀맵(normal map)이라고 하는 특수한 텍스처에 저장한 후, 런타임에는 그림 (a)의 저해상도 메시를 처리하되 노멀맵으로부터 노멀을 읽어서 이를 라이팅에 사용하는 것이다.
  • 이러한 텍스처링 기법을 노멀 매핑(normal mapping) 혹은 범프 매핑(bump mapping)이라 부른다.

 

 

 

 

 

14.1 하이트맵

 

하이트맵. 균일하게 샘플된 (x, y) 좌표에 높이 값이 저장된다. 하이트맵은 회색조의 이미지로 가시화할 수 있다.

 

  • 왼쪽 표면은 이른바 하이트 필드(height field)로 표현할 수 있다.
  • 2차원 좌표(x, y)가 주어졌을 때 높이(height) 혹은 z값을 반환하는 함수 h(x,y)이다. 왼쪽 그림은 일정한 간격의 (x, y) 좌표에서 샘플된 하이트 필드를 보여준다.
  • 이러한 높이 값을 저장한 2차원 텍스처를 하이트맵(height map)이라고 한다.

 

  • 높이 값을 회색조(gray-scale) 색상으로 해석하면 하이트맵은 회색조 이미지로 그릴 수 있다.
  • 색상이 비교적 일정한 부분은 상대적으로 매끈한 영역을 나타내고, 색상이 불규칙한 부분은 오돌토돌한 영역을 나타낸다.

 

 

하이트맵과 노멀맵 생성. (a) 이미지 텍스처. (b) 하이트맵은 이미지 텍스처로부터 반자동으로 생성된다. (c) 노멀맵은 하이트맵으로부터 자동으로 생성된다.

 

  •  (a)의 이미지 텍스처가 주어졌다면, 각 픽셀의 RGB 값을 회색조로 바꾸고, 필요에 따라 이를 수작업으로 편집하여 (b)의 하이트맵을 얻을 수 있다.
  • 이렇게 생성된 하이트맵은 원본 텍스처와 동일한 해상도를 가진다.

 

 

 

 

14.2 노멀맵

 

하이트맵의 한 점에서의 노멀은 그 이웃 점들의 높이를 이용해 계산한다. (a) (x, y, h(x, y))의 노멀은 벡터곱으로 정의된다. (b) (x, y, h(x, y))의 노멀은 (x, y)에 저장된다. (c) RGB 색상 대신 노멀 벡터들을 저장하고 있는 노멀맵을 개념적으로 그렸는데, 모든 노멀은 (0, 0, 1) 방향의 벡터를 '흔들어 놓은' 것으로 묘사할 수 있다.

 

  • 노멀맵을 만드는 방법 중 하나는 하이트맵을 사용하는 것이다.
  • (a)는 아까의 하이트맵을 다시 그린것이고, 하이트맵 텍셀 9개를 이용해 사각형 메시를 만들었다. 이 메시 표면의 가운데 점 (x, y, h(x, y))의 노멀을 계산해보자.

 

  • 이렇게 계산된 노멀은 하이트 필드의 바깥쪽을 가리키며 (x, y, h(x, y)) 주변의 표면 경사도를 반영한다.
  • (c)는 각 텍셀에 노멀이 저장된 노멀맵의 개념을 보여준다. 일반적으로 노멀맵은 하이트맵과 동일한 해상도를 가진다.

 

 

[-1, 1]범위에서 [0, 1] 범위로의 전환

 

  • 정규화된 노멀 $(n_x, n_y, n_z)$의 각 좌표는 모두 [-1, 1] 범위의 실수값이다.
  • 반면, 이런 노멀을 저장할 텍스처의 RGB 채널은 모두 [0, 1] 범위에 있다. 따라서 다음과 같은 범위 전환이 필요하다.

 

  • (c)에서 보인 것 처럼, 노멀맵은 (0, 0, 1)을 이쪽저쪽으로 조금씩 '흔들어 놓은' 노멀들의 집합으로 이해할 수 있다.
  • 따라서, $n_z$가 $n_x$와 $n_y$에 비해 상대적으로 클 것이고, 계산된 R, G, B 중 B값이 크게 된다. 그렇게 되면 결국 노멀맵을 이미지 텍스처로 취급하여 그리면 전체적으로 파란 색조를 띄게 될 것이다.

 

 

 

 

 

 

 

출처

한정현 - [OpenGL ES를 이용한 3차원 컴퓨터 그래픽스 입문]을 보고 공부하고 정리한 내용입니다.

 

 

 

 

728x90