Computer Graphics/OpenGL

OpenGL 정리 - 25. Normal Mapping

surkim 2024. 11. 10. 11:34

1. Normal Mapping

1.1 Normal Mapping이란?

Normal Mapping은 3D 그래픽에서 물체의 표면을 고해상도로 보이게 하는 주요 기술이다. 물체의 표면을 세밀하게 표현하려면 버텍스(Vertex) 수를 크게 늘려야 하는데, 이는 연산 부하를 높이고 성능을 저하시킨다. Normal Mapping을 사용하면 버텍스 수를 최소화하면서도 표면에 입체감을 더할 수 있어, 마치 물체에 고해상도 텍스처가 입혀진 것 같은 효과를 만들어낸다. 조명을 계산할 때 이 텍스처 정보로 각 픽셀의 법선 벡터(Normal)를 조정해 표면의 굴곡이 있는 것처럼 보이도록 만드는 것이다.

1.2 Normal Mapping의 기본 원리

Normal Mapping의 핵심은 법선 맵(Normal Map)이라는 특별한 텍스처를 활용하는 것이다. 이 텍스처는 RGB 색상으로 X, Y, Z 방향에 대한 법선 벡터를 나타내며, 이로 인해 조명 계산 시 각 픽셀이 독립적으로 법선 방향을 가지게 된다. 이렇게 하면 실제로는 평평한 표면이라도 빛의 반응에 따라 굴곡진 것처럼 보이게 된다.

Normal Mapping이 적용된 모델은 낮은 폴리곤 수로도 매우 세밀한 표면 표현이 가능해져, 복잡한 표면을 가진 고해상도 모델처럼 보인다. 이렇게 간단한 트릭으로 시각적인 디테일을 표현할 수 있다는 점이 Normal Mapping의 강점이다!

1.3 Normal Mapping의 한계와 해결 방법

하지만 Normal Mapping에는 한계도 있다. 표면이 굴곡져 보이게 하는 효과이기 때문에 실제 깊이감을 반영하지는 않는다. 또한 물체의 경계선에서는 표면의 깊이를 표현하지 못하므로, 입체감을 잃기 쉽다.

  • 깊이감 부족: Normal Mapping은 실제 기하학적 구조를 바꾸지 않기 때문에, 옆에서 보면 표면이 평면처럼 보일 수 있다.
  • 경계선 문제: 경계선에서 Normal Map이 적용되지 않아 입체감이 떨어지는 문제가 있다.

이를 해결하기 위해 Displacement MappingParallax Mapping이 고안되었다.

  • Displacement Mapping은 법선만 수정하는 Normal Mapping과 달리, 실제 버텍스 위치를 변형하여 깊이감을 더한다. 물론 연산이 많이 필요해 성능에 부담이 크지만, 고품질 그래픽에서는 이 방법이 주로 사용된다.
  • Parallax Mapping은 텍스처 좌표를 조정하여 각도에 따라 깊이감을 표현하는 기법으로, Normal Mapping과 비슷한 원리로 동작하면서도 약간의 깊이감을 더해준다. 이를 통해 물체 표면의 입체감을 더욱 자연스럽게 만든다.

2. Tangent Space와 Normal Mapping의 안정적 적용

Normal Mapping을 사용할 때 물체가 회전하거나 이동하면 Normal Map이 의도한 대로 표현되지 않는 경우가 있다. 이는 법선 벡터를 월드 좌표계(World Space)로컬 좌표계(Local Space)로 변환할 때 생기는 문제로, 이렇게 하면 Normal Map이 물체 표면의 방향에 맞춰 정확하게 적용되지 않는다.

이 문제를 해결하기 위해 사용하는 것이 바로 Tangent Space이다.

2.1 Tangent Space란?

Tangent Space는 각 버텍스를 중심으로 표면에 맞춰 설정한 좌표 공간으로, 법선(Normal), 탄젠트(Tangent), 바이탄젠트(Bitangent) 벡터로 이루어져 있다. 이 좌표 공간을 사용하면 Normal Map이 물체의 회전이나 이동에 영향을 받지 않으면서 자연스러운 표면 디테일을 유지할 수 있다. 이 좌표계는 사실 한 번 익히고 나면 Normal Mapping 외에도 여러 그래픽스 기술에 활용할 수 있다.

  • Tangent Space 구성:
    • Normal: 표면의 수직 방향을 나타내며 조명 계산에 필수적이다.
    • Tangent: 법선에 수직이고 표면의 주요 축을 따른다.
    • Bitangent: Normal과 Tangent에 직교해 로컬 좌표계를 구성한다.
  • Tangent Space의 장점: 이 공간을 사용하면 Normal Map이 물체의 회전과 관계없이 적용된다. 즉, Normal Map이 씌워진 3D 모델이 어떤 방향으로 회전하더라도 Normal Map의 입체감과 조명 효과가 안정적으로 유지된다. 이렇게 Tangent Space를 활용하면 훨씬 안정적이고 일관된 Normal Mapping이 가능하다.

3. Normal Mapping 구현 과정

Normal Mapping의 실제 구현 과정은 다음과 같다.

  1. Normal Map 텍스처 준비:
    • Normal Map은 RGB 값으로 X, Y, Z 축 방향을 나타내며, 주로 R과 G 채널이 X와 Y 방향을, B 채널이 Z 방향을 나타낸다. 이 텍스처는 각 픽셀에 별도의 법선 벡터를 부여한다.
  2. Tangent Space 변환 행렬 생성:
    • 각 표면의 법선, 탄젠트, 바이탄젠트 벡터를 사용해 Tangent Space 변환 행렬을 만들고, Normal Map의 법선 벡터가 Tangent Space에서 일관되게 적용되도록 한다.
  3. 조명 계산:
    • 변환된 Normal 벡터를 사용해 조명 계산을 수행하여 표면에 입체감을 준다. 이렇게 변환된 법선 벡터와 빛의 방향을 기반으로 각 픽셀의 밝기를 계산하면, 평평한 표면도 굴곡진 것처럼 보인다.

4. Normal Mapping의 응용과 확장

Normal Mapping은 기본적인 표면 질감 표현 외에도 다양한 고급 그래픽 기법에 활용된다. 예를 들어, Parallax Mapping과 Displacement Mapping 같은 확장 기법은 Normal Mapping의 단점을 보완해 훨씬 현실적인 표면 표현을 가능하게 한다.

4.1 Parallax Mapping

Parallax Mapping은 Normal Mapping의 깊이감 부족 문제를 해결하기 위한 기법으로, 카메라의 시야각에 따라 텍스처 좌표를 조정하여 입체감을 더해주는 방식이다. 이 방법으로 보면 표면이 각도에 따라 깊이감을 가진 것처럼 보이며, 비교적 적은 연산으로 현실감을 높일 수 있다.

4.2 Displacement Mapping

Displacement Mapping은 각 버텍스의 위치를 실제로 변형하여 깊이감을 표현하는 기법이다. Normal Mapping이나 Parallax Mapping이 시각적으로만 입체감을 표현하는 반면, Displacement Mapping은 실제 기하 구조를 수정하므로 가장 현실적인 결과를 제공한다. 다만, 이 기법은 성능 비용이 높기 때문에, 주로 고사양 그래픽에서 사용된다.