포스트

[ Graphics ] 쉐도우 매핑

쉐도우 매핑


1. 쉐도우 매핑

두 번의 렌더링 패스(rendering pass)를 통해 수행, 쉐도우맵(shadow map) 텍스처를 생성


1) 1 Pass

광원에서 나온 빛이 미치는 표면을 샘플, 각 샘플 점 $p$마다 광원까지의 거리, $z$를 쉐도우 맵에 저장


1 Pass, 깊이맵 생성


  • $z$ : 광원에서 본 3차원 장면의 깊이 (Z Buffer)

광원에 대한 깊이맵(depth map)이라고도 한다.

2) 2 Pass

실제 렌더링을 수행, 쉐도우맵을 사용하여 그림자 생성


2 Pass, 그림자 강도 계산


  • $f$ : 프래그먼트
  • $q$ : 월드 공간의 점
  • $d$ : 광원과 $q$ 사이의 거리

$f_1$에 대응하는 $q_1$의 $d_1$이 $z_1$보다 크므로, $q_1$은 그림자에 속하는 점으로 판정

$f_2$에 대응하는 $q_2$의 $d_2$이 $z_2$와 같으므로, $q_2$은 빛을 받는 점으로 판정


그러나, 이러한 계산 방법으로 쉐도우 매핑 시, 그림자가 없어야 할 부분에 그림자 발생



3) 바이어스 사용

근접점 샘플링(nearest point sampling) 사용 시 $q_1$은 빛을 받는 점이나, $q_1$의 $d_1$이 $z_1$보다 크므로, $q_1$은 그림자에 속하는 점으로 판정


거리 비교

이러한 문제를 해결하기 위해 샘플 점들을 광원 쪽으로 이동한다. 광원까지의 거리 $d$에서 일정한 값(바이어스; bias)을 뺀다. $d_1$에서 바이어스를 빼, $d_1’$을 만들고, $z_1$과 비교 시 $d_1’$이 $z_1$보다 작으므로 $q_1$은 빛을 받는 점으로 판정되어 쉐도우 매핑이 개선된다.


거리 비교


다만, 바이어스에 따라 그림자의 품질이 달라지므로, 적절 바이어스 값 설정이 필요하다.

적절한 바이어스를 설정 필요




2. 쉐도우맵 필터링

쉐도우맵을 통한 투영(project) 시 픽셀 $p_1$과 $p_2$의 색상이 결정된다.그런데 쉐도우맵의 해상도가 충분히 높지 않은 경우, 여러 픽셀이 쉐도우맵의 단일 텍셀에 매핑되어 앨리어싱이 발생할 수 있다.

앨리어싱 발생


이를 해결하기 위해 겹선형 보간을 사용하더라도 완전히 밝거나 완전히 어둡거나 둘 중 하나로 판정된다.

겹선형 보간 시 64로, q보다 작다


이에 대한 대책으로 가시성(visibility)을 사용한다. 네 개의 텍셀 각각에 대해 $q$의 가시성 결정 후 이를 보간하는 것으로, 왼쪽 위의 텍셀만 고려하면 $q$에는 그림자가 맺히는 것으로 판정되어 가시성이 0이나, 나머지 텍셀에 대해서는 $q$는 빛을 받는 것으로 판정되어 가시성이 1이다.네 개의 가시성 값을 겹선형 보간 시, $q$의 가시성은 0.58로 계산되어 0에 가까우면 어둡게, 1에 가까우면 밝게 처리하여 빛을 받는 정도 계산한다.

0에 가까우면 어둡게, 1에 가까우면 밝게 처리


이를 PCF(percentage closer filtering)라고도 한다.



출처: OpenGL ES를 이용한 3차원 컴퓨터 그래픽스 입문

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.