섀도우(Shadows)
전역 조명

방향 광원 섀도우

방향 광원은 일반적으로 햇빛을 시뮬레이션하고, 광원 하나로 씬 전체를 비출 수 있습니다. 따라서 섀도우 맵이 종종 씬의 커다란 부분을 한꺼번에 덮고, 이로 인해 섀도우가 원근 앨리어싱이라는 문제에 취약해집니다. 원근 앨리어싱은 카메라에 가까이 보이는 섀도우 맵 픽셀이 카메라에서 더 멀리 있는 픽셀에 비해 더 비대하고 “덩어리”져 보임을 의미합니다.

먼 거리에 있는 섀도우(A)는 해상도가 적절한 반면, 카메라에 가까이 있는 섀도우(B)는 원근 앨리어싱을 나타냅니다.
먼 거리에 있는 섀도우(A)는 해상도가 적절한 반면, 카메라에 가까이 있는 섀도우(B)는 원근 앨리어싱을 나타냅니다.

원근 앨리어싱은 섀도우 맵에 부드러운 섀도우와 높은 해상도를 사용하는 경우 눈에 덜 띱니다. 하지만 이런 기능을 사용하면 그래픽스 하드웨어 리소스가 더 많이 요구되므로 프레임 속도가 낮아질 수 있습니다.

섀도우 캐스케이드

원근 앨리어싱이 발생하는 이유는 섀도우 맵의 여러 다른 영역이 카메라의 원근에 따라 불균형하게 스케일되기 때문입니다. 광원의 섀도우 맵은 씬에서 카메라에 보이는 부분만 덮으면 됩니다. 이 부분은 카메라의 뷰 절두체에 따라 정의됩니다. 방향 광원이 위에서 바로 내려오는 간단한 경우를 상상해보면 절두체와 섀도우 맵의 관계를 알 수 있습니다.

절두체의 먼 쪽은 섀도우 맵 픽셀 20개로 덮이지만, 가까운 쪽은 픽셀 4개로만 덮입니다. 하지만 양쪽 모두 화면상에는 같은 크기 로 나타납니다. 그 결과 맵의 해상도는 카메라에 가까운 섀도우 영역에서 사실상 훨씬 더 낮습니다(실제로는 해상도가 20x20보다 훨씬 높고 맵은 일반적으로 카메라에 완벽하게 맞지 않습니다).

전체 맵에 더 높은 해상도를 사용하면 덩어리진 영역의 영향을 줄일 수 있지만, 그러면 렌더링 중에 더 많은 메모리와 대역폭이 사용됩니다. 하지만 다이어그램에서 보면 섀도우 맵의 큰 부분이 절두체의 끝자락에서 보이지 않기 때문에 낭비되고 있습니다. 또한 카메라에서 멀리 떨어진 섀도우의 해상도가 너무 높을 가능성이 큽니다. 절두체 영역을 카메라에서 떨어진 거리에 따라 두 개의 존으로 나눌 수 있습니다. 끝자락의 존에는 픽셀 수가 어느 정도 균등해지도록 크기가 더 작은 (하지만 해상도는 같은)별도의 섀도우 맵을 사용할 수 있습니다.

이런 섀도우 맵 크기의 단계적 감소를 cascaded shadow maps라고 하며, 때로는 “Parallel Split Shadow Maps”라고도 합니다. 품질 창에서 주어진 품질 레벨에 대해 캐스케이드를 0개, 2개 또는 4개 설정할 수 있습니다.

캐스케이드를 많이 사용할수록 섀도우가 원근 앨리어싱의 영향을 덜 받지만, 수가 증가하면 렌더링에 리소스가 많이 사용됩니다. 하지만 이 리소스 사용량은 전체 섀도우에 고해상도 맵을 사용하는 경우보다 여전히 적습니다.

캐스케이드를 4개 사용한 이전 예의 섀도우
캐스케이드를 4개 사용한 이전 예의 섀도우

섀도우 거리

오브젝트의 섀도우는 오브젝트가 카메라에서 멀수록 눈에 덜 띄는 경향이 있습니다. 이런 섀도우는 화면에서 더 작아 보이고, 멀리 있는 오브젝트에는 일반적으로 주의가 집중되지 않습니다. Unity에서는 품질 창의 Shadow Distance 프로퍼티를 사용하여 이 효과를 이용할 수 있습니다. 카메라에서 이 거리보다 멀리 떨어져 있는 오브젝트는 섀도우가 전혀 없지만, 이 거리에 근접하는 오브젝트의 섀도우는 점차적으로 페이드 아웃됩니다.

섀도우 거리를 최대한 낮게 설정하면 렌더링 성능을 개선하는 데 유용합니다. 멀리 있는 오브젝트는 섀도우 맵에 렌더링할 필요가 없기 때문입니다. 또한 멀리 있는 섀도우를 제거하면 종종 씬이 더 나아 보입니다. 섀도우 거리를 적절하게 설정하는 것은 특히 모바일 플랫폼의 성능에 중요합니다. 모바일 플랫폼에서는 섀도우 캐스케이드가 지원되지 않기 때문입니다. 현재 카메라 원거리 평면이 섀도우 거리보다 작으면 Unity는 섀도우 거리 대신 카메라 원거리 평면을 사용합니다.

섀도우 파라미터 조정 시각화

씬 뷰에는 색조를 사용하여 씬에서 여러 캐스케이드 레벨을 사용하는 부분을 나타내는 Shadow Cascades 라는 드로우 모드가 있습니다. 이 모드를 사용하면 섀도우 거리, 캐스케이드 수 및 캐스케이드 분할 비율을 알맞게 조정하는 데 유용합니다. 이 시각화에서는 일반적으로 섀도우 거리보다 큰 Scene 뷰 원거리 평면을 사용하므로, 원거리 명면이 작은 Camera의 게임 내 동작과 일치시키려면 섀도우 거리를 줄여야 할 수 있습니다.

씬 뷰의 섀도우 캐스케이드 드로우 모드
씬 뷰의 섀도우 캐스케이드 드로우 모드

섀도우 팬케이킹

섀도우 애크니를 더욱 줄이기 위해 Shadow pancaking 이라는 기법이 사용됩니다. 이 기법은 광원의 방향과 나란히 섀도우 맵을 렌더링할 때 사용되는 광원 공백의 범위를 줄인다는 개념에 바탕을 두고 있습니다. 이렇게 하면 섀도우 맵의 정밀도가 높아져 섀도우 결함이 감소합니다.

섀도우 팬케이킹 원리를 나타내는 다이어그램
섀도우 팬케이킹 원리를 나타내는 다이어그램

위 다이어그램에서

  • 하늘색 동그라미는 섀도우 캐스터를 나타냅니다.
  • 파란색 사각형은 원래 광원 공백을 나타냅니다.
  • 초록색 선은 최적화된 근접 평면을 나타냅니다(뷰 절두체에서 보이지 않는 섀도우 캐스터 제외).

섀도우 캐스터를 최적화된 공백(버텍스 셰이더 내)의 근접 클립 평면에 고정시켜야 합니다. 이 방법은 일반적으로 효과적이지만, 근접 클립 평면을 지나는 매우 큰 삼각형에 결함이 생길 수 있습니다.

큰 삼각형 문제
큰 삼각형 문제

사례에서는 파란색 삼각형의 버텍스 하나만 근접 클립 평면 뒤에 있고 이 평면에 고정됩니다. 하지만 이렇게 하면 삼각형 모양이 변하여 올바르지 않은 섀도우가 생길 수 있습니다.

품질 창에서 Shadow Near Plane Offset 프로퍼티를 미세 조정하여 이 문제를 방지할 수 있습니다. 이렇게 하면 근접 클립 평면이 뒤로 당겨집니다. 하지만 이 값을 매우 높게 설정하면 섀도우 맵이 광원 방향에서 덮어야 하는 범위가 증가하기 때문에 결국에는 섀도우 애크니가 유입됩니다. 그 대신 문제가 있는 섀도우 캐스팅 삼각형을 테셀레이트할 수도 있습니다. 자세한 내용은 섀도우 오버뷰바이어스(bias) 섹션을 참조하십시오.

섀도우(Shadows)
전역 조명