[ Graphics ] 쉐도우 매핑
쉐도우 매핑
1. 쉐도우 매핑
두 번의 렌더링 패스(rendering pass)를 통해 수행, 쉐도우맵(shadow map) 텍스처를 생성
1) 1 Pass
광원에서 나온 빛이 미치는 표면을 샘플, 각 샘플 점 $p$마다 광원까지의 거리, $z$를 쉐도우 맵에 저장
- $z$ : 광원에서 본 3차원 장면의 깊이 (Z Buffer)
광원에 대한 깊이맵(depth map)이라고도 한다.
2) 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$의 색상이 결정된다.그런데 쉐도우맵의 해상도가 충분히 높지 않은 경우, 여러 픽셀이 쉐도우맵의 단일 텍셀에 매핑되어 앨리어싱이 발생할 수 있다.
이를 해결하기 위해 겹선형 보간을 사용하더라도 완전히 밝거나 완전히 어둡거나 둘 중 하나로 판정된다.
이에 대한 대책으로 가시성(visibility)을 사용한다. 네 개의 텍셀 각각에 대해 $q$의 가시성 결정 후 이를 보간하는 것으로, 왼쪽 위의 텍셀만 고려하면 $q$에는 그림자가 맺히는 것으로 판정되어 가시성이 0이나, 나머지 텍셀에 대해서는 $q$는 빛을 받는 것으로 판정되어 가시성이 1이다.네 개의 가시성 값을 겹선형 보간 시, $q$의 가시성은 0.58로 계산되어 0에 가까우면 어둡게, 1에 가까우면 밝게 처리하여 빛을 받는 정도 계산한다.
이를 PCF(percentage closer filtering)라고도 한다.
출처: OpenGL ES를 이용한 3차원 컴퓨터 그래픽스 입문