Shadow Mapping

Why Shadows?

렌더링의 현실성을 높이기 위해 그림자가 필요
그림자는 사람이 깊이를 인지하는데 중요한 역할을 함

Shadow Mapping

Pass - 1

광원을 기준으로 각 물체 표면까지 얼마나 떨어져 있는가의 깊이(Depth) 정보를 저장
Shadow Map : 깊이 정보를 모아둔 텍스처

Pass - 2

카메라 시점에서 실제 장면을 렌더링
각 픽셀에 대해 광원까지의 거리(d) 를 계산
Pass 1 에서 만든 그림자 맵에 저장된 깊이 값(z) 과 비교

  • d > z : 그림자에 가려진 부분
  • d <= z : 빛을 받는 부분

Surface Acne

의도된 그림자는 정상적으로 표현되었으나, 빛을 받는 표면에 부분부분 그림자가 있는 것처럼 어둡게 표현되는 현상

Depth Map을 만들 때 사용한 위치, 해상도와 최종적으로 이미지를 만들 때 카메라 뷰의 위치와 해상도가 다르기 때문에 문제가 발생함
Depth Map은 이산적인 텍셀 단위로 깊이 값을 저장하기에 실제 렌더링 과정에서는 연속적인 표면 위의 한 점에 대한 깊이 값을 비교하기에 문제 발생 가능

실제로는 빛이 들어오는 부분이지만, 항상 d > z 가 성립하는 경우가 발생할 수 있어 어둡게 표현됨

해결 방안 : Bias

두 번째 패스에서 광원까지의 거리를 계산할 때, 아주 작은 값(바이어스)를 빼주어 d 값을 낮춤
bias는 사용자가 설정하기에 너무 크면 그림자가 작아지고, 너무 작으면 문제가 유지될 수 있음

float bias = max(0.05 * (1.0 - dot(normal, lightDir)), 0.055);

normal과 lightDir 사이의 각도가 커질수록 Bias가 커지는 이유는 각도가 커질수록 그림자 맵의 동일한 한 픽셀이 담당하는 영역이 커지게 되며 큰 영역 내 깊이 차이가 다른 영역에 비해 크게 발생하기에 Surface Acne 이 발생할 확률이 훨씬 높아져 이를 해결하기 위함

Aliasing

여러 픽셀이 그림자 맵의 단일 텍셀에 매핑되며 해상도가 낮은 이미지처럼 보이는 현상
그림자 맵의 해상도에 따라 정보가 충분하지 않으면 여러 픽셀이 단일 텍셀에 매핑되어 해당 문제 발생 가능

해결방안 : percentage closer filtering (PCF)

그림자 안에 있는지 없는지를 이진법으로 결정하는 대신, 물체가 얼마나 그림자져있는지 정도를 이용하는 방식
현재 픽셀 주변의 여러 그림자 맵 텍셀 값과 깊이를 각각 비교한 후, 그 결과(0 또는 1)를 평균내어 그림자 경계를 부드럽게 처리


참고 영상 : ComputerGraphics Lecture 15. Shadow Mapping - 김형기 교수님
참고 자료 : Introduction to Computer Graphics with OpenGL ES

0개의 댓글