그림자: 빛의 경로가 차폐물(occluder)에 의해 막혔을 때 생기는 검은 영역
그림자의 종류는 다시 Hard shadow와 Soft shadow로 나뉘는데, 전자는 point light일 때, 후자는 extended light일 때 나타난다. extended light는 사실 점 광원의 집합이기 때문에 다음과 같이 쉽게 원리가 이해된다.
결국 그림자가 생기는지를 보려면 광선이 물체와 부딪히는지를 판별해야 한다. 기존 Intensity 공식에서는 Visibility term 으로 기술된다. 다시말해 만약 물체와 부딪힌다면, 빛은 오로지 엠비언트 빛으로만 구성되게 된다.
Shadow Maps
1) 광원에서 물체와의 거리를 값으로 측정해 z-buffer에 저장한다.
2) 관찰자 시점에서 먼저 물체를 볼 수 있는지 계산하고, 볼 수 있다면 그 물체와 광원과의 거리를 계산한다. 이 계산된 값을 z-buffer값과 비교했을 때 더 크다면, 그 물체에는 그림자가 생긴다.
알고리즘은 명료하지만, 일단 '내 눈에서 볼 수 있는가?' 를 계산하기 위해서는 Eye space -> World space -> Light space를 거쳐 환산시켜야 한다.
또한 앨리어싱 문제가 발생할 수 있다고 알려져있다. 만약 각도 가 매우 작다면 object에 대응되는 z-buffer에 저장되는 픽셀들의 개수는 매우 적다. 반면 사용자 눈에서 봤을 떄는 매우 넓은 면적의 object에 대응되는 픽셀들이 렌더링 되어야 한다면, z-buffer에 저장된 정보의 양과 사용자가 요구하는 정보의 양의 차이로 인해서 앨리어싱이 발생하게 된다.
마찬가지로 사용자 눈에서 매우 가까운 물체도 그림자 샘플의 개수가 부족해서 앨리어싱이 발생하게 된다. 이를 고려해, view frustum을 잘 구성하는게 Shadow maps에서 앨리어싱이 발생하지 않는 방법이다.
정리하자면, Shadow maps는 물체의 실루엣을 계산하지 않아도 되고, 매우 빠르다. 하지만 앨리어싱이 발생한다는 문제점이 있다.
Shadow Volumes
물체의 실루엣을 먼저 계산하고, 그 실루엣을 기반으로 볼륨을 만드는 방법. 먼저 Shadow volumes를 만들고 각 면을 어떤 방향으로 통과하는가에 대해서 카운터를 +1, -1 단위로 조정한다.
여러 광원의 계산이 고려하는 계산이 가능하며 앨리어싱이 적다는 장점이 있지만, 구현이 복잡하고 실루엣이 복잡한 물체는 다루기 까다로울 수 있다.