ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [컴퓨터 그래픽스] Normal Mapping-1
    컴퓨터그래픽스 2024. 2. 16. 13:52

    이 단원은 그래픽스 수업을 들으며 가장 이해가 안됐던 (실은 지금도 정리하기 두려울 정도로) 부분이다. 이 파트로 인해 기말을 말아먹었는데 ㅎㅎ 다시 공부해서 알면 되니께~~ 한번 파보자. 두 번에 걸쳐 포스팅 할 것이다.

    ​

    (a)는 우리가 흔히 보는 돌바닥의 polygon mesh이다. 이를 확대한 것이 (d)이다. 여기서 다시 짚고 넘어가야 하는 개념이 있다. 퐁 라이트닝을 구성하는 4개의 항중 디퓨즈 항(diffuse term)을 생각해야 한다. 이는 그림 (d)의 세 점 a,b,c에서 뻗어있는 두 벡터 n과 l에 의해 결정된다. 두 벡터 사이의 각이 클수록 빛을 적게 받고, 각이 작으면 빛은 크게 받는다. 표면 밝기가 이렇게 불규칙적이면 오돌토돌한 질감을 잘 나타낼 수 있다. 문제는 polygon mesh의 개수가 엄청 많아서 처리에 많은 시간이 소요된다는 것이다.

    ​

    ​

    ​

    ​

    ​

    ​

    ​

    2개의 polygon mesh로 구성된 표면은 어떨까? 이때는 정점의 normal들이 모두 일정하기 때문에 점이 광원과 가까울수록 벡터 사이의 각이 서서히 좁아지게 되어 더 많은 빛을 받게 된다. 이것이 (c)에 드러난다. 딱 봐도 앞서 봤었던 예시보다 화질이 구리다. 그 대신 계산 속도는 무지 빠를 것이다.

    ​

    ​

    ​

    ​

    ​

    ​

    빠른 계산과 다양한 형태의 normal, 두 마리 토끼를 모두 잡기 위해 고안된 방법이 바로 Normal Mapping이다. 고해상도 polygon mesh에서 먼저 normal만 계산한 후 이를 노멀맵(normal map)이라는 특수한 텍스처에 저장한다. 그리고 런타임에는 저해상도 mesh를 처리하면서 normal map에 저장된 normal을 가져와 사용하는 것이다.

    ​

    ​

    ​

    ​

    ​

    ​

    1. 하이트맵

    위 그림에서 회색 격자로 된 2차원 평면을 보면 각기 다른 높이를 가진 노란색 선을 확인할 수 있다. 이는 고해상도 메쉬가 가지는 제각각의 높이 (z값) 를 나타낸 것이다. x,y 값이 주어지면 해당하는 점의 높이 z를 반환해주는 함수가 바로 하이트 필드(Height field)이다. 높이를 회색조의 색상으로 해석할 수 있는데, 높이가 높을수록 흰색에 가깝고 낮을수록 검은색에 가깝다.

    ​

    ​

    ​

    ​

    ​

    이런 하이트 맵은 이미지 텍스처로부터 반자동적으로 생성된다. 앞서 설명한 normal map은 하이트 맵에서 자동으로 생성될 수 있다.

    ​

    ​

    ​

    ​

    ​

    생성 방식은 위와 같다. 한 좌표 x,y의 normal은 그 좌표의 상하좌우에 위치한 좌표들로부터 계산된다. 그림을 보면 상하를 이은 벡터와 좌우를 이은 벡터 두개가 있는데, 이들의 벡터곱을 (x, y, h(x,y))의 normal로 취하면 된다. 정규화하여 오른쪽 그림과 같이 normal map에 저장한다.

    ​

    ​

    ​

    ​

    ​

    ​

    normal 맵은 위에서 봤듯이 파란색 색조를 띄고 있다. normal 의 범위는 [-1. 1]인데, 이를 저장할 텍스처의 RGB는 범위가 [0,1]이다.

    완벽하게 평평한 지면에서 하이트 맵을 생성하면 그 높이가 다 같을 것이고, 그런 하이트 맵으로부터 normal map을 생성하면 노멀 맵의 텍셀에는 모두 (0, 0, 1)이 저장된다. 지면에 급경사가 없는 경우 대부분의 영역에서 normal의 x,y,z 좌표는 (0, 0, 1)과 크게 다르지 않을 것이다. 그렇기 때문에 normal map은 파란 색조를 띄는 것이다. (R,G,B중 B의 값이 압도적으로 큰 경우가 많기 때문)

    ​

    ​

    ​

    ​

    ​

    최종적으로 이미지 텍스처링과 노멀 매핑을 모두 적용한 결과는 다음과 같다. 물론 가장 퀄리티는 고해상도 mesh에서 나오지만, 그에 못지 않게 좋은 질감을 가진 것을 확인할 수 있다.

    ​

    ​

    ​

    ​

    2. 탄젠트 공간 노멀 매핑

    만들어진 텍스처를 물체 표면에 입혀줘야 하는데 이때 탄젠트 공간이라는 개념을 추가해야 한다.

    물체 표면의 한 점에서의 normal을 N 이라 하면, N에 수직인 접면에서 두 벡터 T와 B를 정의할 수 있다. (t는 탄젠트, B는 바이탄젠트임) T,B,N으로 정의된 공간을 탄젠트 공간이라 한다.

    ​

    만약 normal mapping을 쓰지 않는다면 lighting에 그냥 N을 쓰면 된다. 그러나 normal mapping을 사용한다면 노멀맵에서 가져온 노멀을 사용해야 한다. 노멀맵에서 읽어온 노멀은 바로 그 점의 탄젠트 공간에서 정의된 벡터로 볼 수 있는데, 이를 탄젠트 공간 노멀이라 한다.

Designed by Tistory.