Computer Graphics/OpenGL

OpenGL 정리 - 24. Shadow Mapping

surkim 2024. 11. 10. 11:25

1. Shadow Mapping

1.1 Shadow Mapping이란?

Shadow Mapping은 3D 장면에서 물체의 그림자를 표현하기 위한 기법으로, 빛과 물체 간의 상호작용을 통해 장면의 깊이와 사실감을 부여하는 효과적인 방법이다. 그림자는 물체와 주변 환경 간의 관계를 시각적으로 표현해 주기 때문에, 게임과 그래픽스에서 필수적인 요소로 자리 잡고 있다. Shadow Mapping은 특히 구현 난이도가 비교적 낮고 성능이 우수하여 많이 사용되며, 다양한 확장 기법을 통해 보다 사실적인 그림자 표현도 가능하다. 예를 들어 Omnidirectional Shadow MappingCascaded Shadow Mapping을 통해 포인트 라이트 및 넓은 범위의 그림자를 보다 정확하게 표현할 수 있다.

1.2 Shadow Mapping의 기본 원리

Shadow Mapping은 빛의 시점에서 장면을 렌더링하여 깊이 정보를 얻고, 이를 기준으로 그림자 여부를 결정하는 방식으로 작동한다. 이 과정은 크게 두 단계로 나뉜다:

  1. 빛의 시점에서 깊이 맵 렌더링:
    • 빛의 위치와 방향을 기준으로 장면을 렌더링하여 각 픽셀의 깊이 값을 Shadow Map으로 저장한다. 이렇게 생성된 Shadow Map은 각 픽셀이 빛을 받는지 여부를 판단하는 기준이 된다.
  2. 카메라 시점에서 Shadow Map 활용:
    • 실제 카메라에서 장면을 렌더링할 때, Shadow Map을 통해 현재 픽셀이 빛을 받는지 여부를 판단한다. Shadow Map에 저장된 깊이 값과 현재 픽셀의 깊이 값을 비교하여, Shadow Map에 기록된 깊이 값보다 더 먼 거리에 있는 픽셀은 그림자로 처리한다.

2. Shadow Mapping 구현 과정

Shadow Mapping을 구현하기 위해 필요한 핵심 과정은 다음과 같다:

  1. 빛의 시점에서 깊이 맵 렌더링:
    • 빛의 시점(View)투영(Projection) 행렬을 설정하여, 빛의 시점에서 깊이 정보를 Shadow Map에 기록한다. 이 과정에서는 빛의 시야에서 장면의 깊이만 계산하며, 색상 정보는 필요하지 않다.
  2. 카메라 시점에서 Shadow Map 활용:
    • 카메라에서 장면을 렌더링할 때, 빛의 시점에서 계산한 깊이 정보를 카메라 좌표계에 맞게 변환하여 Shadow Map을 참고해 그림자 여부를 판단한다. 이를 위해 카메라에서 보이는 각 픽셀의 위치를 빛의 좌표계로 변환한 후, Shadow Map에서의 깊이 값과 비교한다.

2.1 그림자 여부 계산

그림자 여부를 판단하기 위해 현재 픽셀의 깊이 값과 Shadow Map의 깊이 값을 비교한다. 카메라 시점에서 변환된 픽셀이 Shadow Map에서 더 먼 깊이 값을 가지면, 이 픽셀은 그림자에 포함된 것으로 간주한다.

3. Shadow Mapping의 문제점 및 해결 방법

Shadow Mapping은 간단하면서도 효과적인 그림자 기법이지만, 몇 가지 문제점이 있다. 이 문제들은 여러 최적화 기법을 통해 개선할 수 있다.

3.1 Shadow Acne

Shadow Acne는 그림자가 있는 표면에 줄무늬 같은 아티팩트가 나타나는 현상이다. Shadow Map의 해상도가 제한적이기 때문에, 특히 광원에서 먼 픽셀들이 같은 깊이 값을 가질 확률이 높아져 발생한다.

  • 해결 방법:
    • Bias 추가: 깊이 비교 시 약간의 Bias(편차)를 더해줌으로써 줄무늬를 줄인다. Bias 값이 너무 작으면 여전히 Acne가 발생하고, 너무 크면 그림자가 떠 보이는 현상(Peter Panning)이 생길 수 있으므로, 적절한 값을 찾아야 한다.
    • 다이나믹 Bias: 픽셀의 각도와 거리에 따라 Bias 값을 조정하여 상황에 맞는 그림자 품질을 보장할 수 있다.

3.2 Peter Panning

Peter Panning은 그림자가 물체에서 떠 있는 것처럼 보이는 현상으로, 주로 Bias를 과하게 적용할 때 발생한다.

  • 해결 방법: Bias 값을 상황에 맞게 최적화하여 Shadow Acne와 Peter Panning 사이에서 균형을 유지한다. 다이나믹 Bias 또는 깊이에 따라 Bias를 조정하는 방식이 효과적이다.

3.3 Jagged Edges

그림자 맵의 해상도가 낮거나 정밀도가 부족할 경우, 그림자 테두리가 계단처럼 울퉁불퉁하게 나타나는 Jagged Edge 문제가 발생한다. 이는 해상도 부족, 깊이 정밀도, 그리고 테두리 블러링이 부족하여 발생하는 현상이다.

  • 해결 방법:
    • 고해상도 Shadow Map: 해상도를 높여 계단 현상을 줄일 수 있지만, 성능 부담이 커질 수 있다.
    • PCF (Percentage Closer Filtering): 그림자 맵의 특정 지점뿐만 아니라 주변 샘플을 함께 계산하여 평균화하여 그림자 경계를 부드럽게 만든다. 이를 통해 Jagged Edge를 줄이고, 자연스럽게 경계가 흐려지도록 할 수 있다.

4. 다양한 조명 유형에 따른 Shadow Mapping 기법

4.1 Directional Light와 Cascaded Shadow Map (CSM)

Directional Light(예: 태양광)에서 발생하는 그림자는 넓은 범위에 걸쳐 있어 일반적인 Shadow Map을 사용할 경우 그림자가 뭉개지거나 해상도가 떨어질 수 있다. Cascaded Shadow Map (CSM)장면을 여러 개의 Shadow Map으로 나누어 넓은 범위에서도 세밀한 그림자를 표현하는 기법이다.

  • CSM 작동 방식:
    • 장면을 가까운 영역에서 먼 영역까지 여러 구역으로 나눈 후 각 구역마다 별도의 Shadow Map을 생성한다.
    • 카메라와 가까운 구역일수록 고해상도 Shadow Map을 적용하여 세밀한 그림자를 표현한다.

4.2 Point Light와 Omni-directional Shadow Map

포인트 라이트는 모든 방향으로 빛을 방출하기 때문에, 단일 Shadow Map으로는 불가능하다. 이를 위해 큐브맵 형태의 Omni-directional Shadow Map을 사용하여 다방향 그림자를 구현할 수 있다.

  • Omni-directional Shadow Map 작동 방식:
    • 포인트 라이트의 위치에서 6개의 방향(큐브맵의 각 면)에 대해 깊이 맵을 생성한다.
    • 큐브맵 형태로 저장된 Shadow Map을 사용해 포인트 라이트의 모든 방향에서 정확한 그림자를 표현한다.