그림자 (Shadows)
그림자는 게임에 사실감을 더하는 훌륭한 방법입니다. 하지만 동적(실시간) 그림자는 상당한 런타임 성능 비용을 수반할 수 있습니다.

OasisW 엔진은 그림자 매핑(shadow mapping)이라는 그림자 알고리즘을 구현합니다. 이는 완전히 크로스 플랫폼이므로 모바일과 데스크톱 모두에서 작동이 보장됩니다.
그림자 활성화
기본적으로 OasisW에서는 그림자 캐스팅이 비활성화되어 있습니다. 직접 명시적으로 활성화해야 합니다. 다행히 그림자를 활성화하는 것은 쉽습니다. 먼저 씬에서 그림자를 캐스팅하고 싶은 조명을 식별하세요. Hierarchy에서 조명을 선택하여 Inspector 패널에서 속성을 편집합니다. 모든 조명에는 'Cast Shadows' 옵션이 있습니다. 씬의 그림자 캐스팅 그래픽 객체에 대한 그림자를 생성하려면 이 옵션을 체크하기만 하면 됩니다.

이제 씬의 어떤 그래픽 객체가 그림자를 캐스팅하고 받을지 지정해야 합니다. 기본적으로 모든 렌더 및 모델 컴포넌트는 그림자를 캐스팅하고 받습니다. 이러한 속성을 수정하려면 Hierarchy에서 엔티티를 선택하고, Inspector에서 렌더 또는 모델 컴포넌트를 찾아 필요에 따라 'Cast Shadows' 또는 'Receive Shadows' 옵션을 체크 해제하세요.
그림자 캐스케이드
방향성 그림자가 넓은 영역에 사용될 때, 카메라 근처의 그림자가 낮은 해상도를 가지는 앨리어싱 현상이 자주 발생합니다. 이를 개선하기 위해 단일 그림자 맵에서 그림자를 캡처하려면 매우 높고 비현실적인 해상도가 필요합니다.
그림자 캐스케이드는 시야 방향을 따라 카메라 뷰 프러스텀을 분할하고, 각 분할에 대해 별도의 그림자 맵을 사용하여 이 문제를 해결하는 데 도움이 됩니다. 이렇게 하면 근처 객체에 하나의 그림자 맵을 제공하고, 다른 그림자 맵은 거리의 모든 것을 캡처하며, 선택적으로 그 사이에 추가 그림자 맵을 사용할 수 있습니다.
그림자 캐스케이드의 수는 성능에 영향을 미치므로 주의하세요. 각 그림자 캐스팅 메시가 단일 그림자 맵보다 더 많이 렌더링될 수 있기 때문입니다.
다음 속성을 사용하여 그림자 캐스케이드를 설정할 수 있습니다.
캐스케이드 수
캐스케이드 수는 뷰 프러스텀 분할의 수를 나타내며, 1, 2, 3 또는 4가 될 수 있습니다. 기본값인 1은 단일 그림자 맵을 나타냅니다.
단일 그림자 캐스케이드를 보여주는 스크린샷입니다.

네 개의 그림자 캐스케이드를 보여주는 스크린샷입니다.

캐스케이드 분포
개별 그림자 캐스케이드에 대한 카메라 프러스텀 분할의 분포입니다. 0에서 1 사이의 값을 지정할 수 있습니다. 값 0은 선형 분포를 나타내고, 값 1은 로그 분포를 나타냅니다. 시각적으로, 더 높은 값은 전경 객체에 더 많은 그림자 맵 해상도를 분배하고, 더 낮은 값은 더 먼 객체에 분배합니다.
그림자 조정
OasisW에서 사용하는 그림자 매핑 기술은 유한한 해상도만 가지고 있습니다. 따라서 가능한 한 좋게 보이도록 일부 값을 조정해야 할 수 있습니다. 다음 속성은 조명 컴포넌트 UI에서 찾을 수 있습니다.
그림자 거리
그림자 거리는 시점으로부터 방향성 조명 그림자가 더 이상 렌더링되지 않는 거리입니다. 이 값이 작을수록 그림자가 더 선명해집니다. 문제는 시점이 씬 주위를 이동할 때 뷰어가 그림자가 갑자기 나타나는 것을 볼 수 있다는 것입니다. 따라서 플레이어가 얼마나 멀리 볼 수 있는지와 일반적으로 좋아 보이는 것에 따라 이 값을 균형있게 조정해야 합니다.
그림자 강도
그림자의 강도로, 1은 이 조명에 의한 전체 강도 그림자를 나타내고, 0은 그림자가 없음을 나타냅니다.

그림자 해상도
모든 조명은 그림자 맵을 통해 그림자를 캐스팅합니다. 이 그림자 맵은 256x256, 512x512, 1024x1024 또는 2048x2048의 해상도를 가질 수 있으며, 이 값은 조명 컴포넌트 인터페이스에서도 설정됩니다. 해상도가 높을수록 그림자가 더 선명해집니다. 하지만 더 높은 해상도의 그림자는 렌더링 비용이 더 높으므로 성능과 품질의 균형을 맞추세요.
그림자 바이어스
그림자 매핑은 매우 보기 싫은 렌더링 아티팩트가 발생하기 쉽습니다. 예상하지 못한 곳에서 그림자 띠나 반점 패치를 발견한다면, 문제를 해결하기 위해 그림자 바이어스를 조정해 보세요.
노멀 오프셋 바이어스
'그림자 여드름(Shadow acne)' 아티팩트는 큰 문제이며, 그림자 바이어스가 이를 매우 효과적으로 제거할 수 있습니다. 불행히도, 이것은 항상 어느 정도의 '피터 팬닝(Peter Panning)' 현상을 도입합니다. 이는 그림자가 객체가 공중에 떠 있는 것처럼 보이게 만드는 현상입니다.
노멀 오프셋 바이어스가 이 문제를 해결합니다. 깊이 바이어스를 사용하는 것 외에도, 그림자 맵 조회에 사용되는 UV 좌표를 약간 조정하여 그림자 여드름과 피터 팬닝을 모두 피할 수 있습니다. 프래그먼트의 위치는 기하학적 노멀을 따라 오프셋됩니다. 이 "노멀 오프셋" 기법은 상수 그림자 바이어스만 사용하는 접근법보다 훨씬 우수한 결과를 제공합니다.
소프트 그림자 vs 하드 그림자
그림자의 윤곽을 반음영(penumbra)이라고 합니다. 이는 어둠에서 밝음으로의 전환으로 그림자에 부드러운 가장자리를 제공합니다. 그림자 가장자리를 부드럽게 하는 것이 OasisW의 기본값이지만, 하드 가장자리 그림자를 원한다면 이 설정을 변경할 수 있습니다. 소프트와 하드 가장자리 그림자의 비교는 아래를 참조하세요:

소프트 그림자는 GPU에서 그림자 맵의 더 많은 샘플을 수행하여 달성됩니다. 사용되는 알고리즘은 Percentage Closest Filtering 또는 줄여서 PCF라고 합니다. 이 알고리즘은 하드 그림자에 사용되는 단일 샘플 대신 그림자 맵에서 9개의 지역화된 샘플(3x3 행렬)을 읽습니다.
그림자 샘플링 타입은 조명별로 지정되므로 이 옵션은 조명 Inspector에서 찾을 수 있습니다.
성능 고려사항
그림자를 활성화하면 성능에 영향을 미칩니다:
- 그림자를 캐스팅하는 각 방향성 또는 스팟 조명에 대해, 씬은 매 프레임마다 그림자 맵에 한 번 렌더링되어야 합니다. 전방향 조명 그림자는 조명당 씬이 6번 렌더링되므로 훨씬 더 비용이 높습니다(그림자 맵은 6면 큐브 맵으로 저장됨). 씬을 그림자 맵에 렌더링하는 것은 CPU와 GPU 모두에 부하를 줍니다.
- 더 높은 그림자 맵 해상도를 사용하면 더 선명한 그림자를 생성하지만, GPU가 더 많은 그림자 맵 픽셀을 채워야 하므로 프레임 레이트에 영향을 줄 수 있습니다.
- 그림자를 받는 머티리얼에서 그림자 샘플 타입으로 소프트 그림자(PCF3x3)를 선택하는 것은 하드 그림자 옵션보다 GPU에서 더 비용이 높습니다.