Normal Mapping

Normal Mapping

  • 한 면을 표현하는 Vertex들의 Normal 값이 같다면 내부의 vector들도 동일한 값을 가진다.

  • 구의 같은 경우 각각의 Vertex마다 Normal값을 다르게 주기 때문에 입체적인 구현이 가능하지만 큐브의 경우 각 면을 표현하는 Vertex값이 같은 Normal값을 가지므로 내부의 픽셀들 또한 입체적으로 표현되지 않는다.

// 큐브의 앞면을 나타냄
	vec[0] = Vertex(Vec3(-w2, -h2, -d2), Vec2(0.0f, 1.0f), Vec3(0.0f, 0.0f, -1.0f), Vec3(1.0f, 0.0f, 0.0f));
	vec[1] = Vertex(Vec3(-w2, +h2, -d2), Vec2(0.0f, 0.0f), Vec3(0.0f, 0.0f, -1.0f), Vec3(1.0f, 0.0f, 0.0f));
	vec[2] = Vertex(Vec3(+w2, +h2, -d2), Vec2(1.0f, 0.0f), Vec3(0.0f, 0.0f, -1.0f), Vec3(1.0f, 0.0f, 0.0f));
	vec[3] = Vertex(Vec3(+w2, -h2, -d2), Vec2(1.0f, 1.0f), Vec3(0.0f, 0.0f, -1.0f), Vec3(1.0f, 0.0f, 0.0f));
//각 정점들이 같은 Normal로 표현된다
  • Vertex의 수를 늘려주는 방식으로 입체적으로 표현하도록 해결하면 늘어난 Vertex에 따라 연산양이 늘어나기 때문에 적합하지 않다.

  • 따라서 별도의 이미지 파일인 Normal Map을 만들어 각 픽셀에 해당하는 Normal값을 저장하여 사용하는 방식으로 해결하는 방법이 Normal Mapping이다.

Normal Mapping은 텍스처의 각 픽셀의 Normal 값을 가진 별도의 파일에서 정보를 불러와 텍스처를 보다 입체적이게 표현하는 방법이다.

  • Normal Texture는 별도의 좌표계인 Tangent Space를 활용한다.

  • Tangent Space란?

    • 접하는 평면을 기준으로 좌표계를 새로 생각한다.
    • 따라서 Normal Vector는 대부분 Up방향을 향한다. 전체 맵의 성분을 그려주면 대부분 파란색으로 표현되는 것이 그 이유 이다.

    결과

  • before

  • after

왼쪽: NormalMapping 적용
오른쪽: 미적용

좋은 웹페이지 즐겨찾기