231026 Shadows

aliceshard·2023년 11월 26일
0

  • 그림자: 빛의 경로가 차폐물(occluder)에 의해 막혔을 때 생기는 검은 영역

  • 그림자의 종류는 다시 Hard shadow와 Soft shadow로 나뉘는데, 전자는 point light일 때, 후자는 extended light일 때 나타난다. extended light는 사실 점 광원의 집합이기 때문에 다음과 같이 쉽게 원리가 이해된다.

  • 결국 그림자가 생기는지를 보려면 광선이 물체와 부딪히는지를 판별해야 한다. 기존 Intensity 공식에서는 Visibility term SiS_i으로 기술된다. 다시말해 만약 물체와 부딪힌다면, 빛은 오로지 엠비언트 빛으로만 구성되게 된다.

  • Shadow Maps
    1) 광원에서 물체와의 거리를 zz값으로 측정해 z-buffer에 저장한다.
    2) 관찰자 시점에서 먼저 물체를 볼 수 있는지 계산하고, 볼 수 있다면 그 물체와 광원과의 거리를 계산한다. 이 계산된 값을 z-buffer값과 비교했을 때 더 크다면, 그 물체에는 그림자가 생긴다.

    알고리즘은 명료하지만, 일단 '내 눈에서 볼 수 있는가?' 를 계산하기 위해서는 Eye space -> World space -> Light space를 거쳐 환산시켜야 한다.

    또한 앨리어싱 문제가 발생할 수 있다고 알려져있다. 만약 각도 α\alpha가 매우 작다면 object에 대응되는 z-buffer에 저장되는 픽셀들의 개수는 매우 적다. 반면 사용자 눈에서 봤을 떄는 매우 넓은 면적의 object에 대응되는 픽셀들이 렌더링 되어야 한다면, z-buffer에 저장된 정보의 양과 사용자가 요구하는 정보의 양의 차이로 인해서 앨리어싱이 발생하게 된다.

마찬가지로 사용자 눈에서 매우 가까운 물체도 그림자 샘플의 개수가 부족해서 앨리어싱이 발생하게 된다. 이를 고려해, view frustum을 잘 구성하는게 Shadow maps에서 앨리어싱이 발생하지 않는 방법이다.
정리하자면, Shadow maps는 물체의 실루엣을 계산하지 않아도 되고, 매우 빠르다. 하지만 앨리어싱이 발생한다는 문제점이 있다.

  • Shadow Volumes
    물체의 실루엣을 먼저 계산하고, 그 실루엣을 기반으로 볼륨을 만드는 방법. 먼저 Shadow volumes를 만들고 각 면을 어떤 방향으로 통과하는가에 대해서 카운터를 +1, -1 단위로 조정한다.


여러 광원의 계산이 고려하는 계산이 가능하며 앨리어싱이 적다는 장점이 있지만, 구현이 복잡하고 실루엣이 복잡한 물체는 다루기 까다로울 수 있다.

  • 간단 비교
profile
안녕하세요.

0개의 댓글