Unity는 섀도우 매핑이라고 부르는 기술을 사용하여 실시간 그림자를 렌더링합니다.
섀도우 매핑은 섀도우 맵이라는 텍스처를 사용합니다. 섀도우 맵은 뎁스 텍스처와 유사합니다. 카메라가 뎁스 텍스처를 생성하는 방법과 유사한 방식으로 광원이 섀도우 맵을 생성합니다. 카메라가 광원과 같은 위치에 있는 경우 카메라가 볼 수 없는 씬의 영역은 광선이 도달할 수 없는 씬의 영역과 동일합니다. 그러므로 이러한 영역은 그림자 속에 있습니다.
Unity는 광선이 표면에 닿을 때까지 이동하는 거리에 대한 정보로 섀도우 맵을 채운 후 섀도우 맵을 샘플링하여 광원이 닿는 게임 오브젝트의 실시간 그림자를 계산합니다.
섀도우 매핑에 대한 자세한 정보는 섀도우 매핑에 대한 Wikipedia 페이지를 참조하십시오.
섀도우 맵의 해상도를 계산하기 위해 Unity는 다음을 수행합니다.
광원이 비출 수 있는 화면 뷰의 영역을 결정합니다. 방향 광원의 경우 전체 화면에 조명을 비출 수 있습니다. 스폿 광원 및 점 광원의 경우 영역은 광원 범위 모양(점 광원의 경우 구체, 스폿 광원의 경우 원뿔)을 화면에 투사합니다. 투사된 모양은 화면에 너비 및 높이(픽셀 단위)로 표시됩니다. 두 값 중 큰 값이 사용됩니다. 이러한 값을 광원의 픽셀 크기라고 부릅니다.
다음 계산을 수행한 후 결과를 최대 값에 고정합니다.
광원 타입: | 수식: | 최대 해상도(픽셀): |
---|---|---|
방향성 모드 | NextPowerOfTwo(픽셀 크기* 그림자 품질 멀티플라이어* 3.0) | 그림자 해상도가 매우 높은 품질이거나 GPU의 RAM이 512MB 이상이면 4096 x 4096이고, 그 외의 경우에는 2048 x 2048입니다. |
스폿 광원 | NextPowerOfTwo(픽셀 크기* 그림자 품질 멀티플라이어* 2.0) | GPU의 RAM이 512MB 이상이면 2048 x 2048이고, 그 외의 경우에는 1024 x 1024입니다. |
점 광원 | NextPowerOfTwo(픽셀 크기* 그림자 품질 멀티플라이어* 1.0) | GPU의 RAM이 512MB 이상이면 1024 x 1024이고, 그 외의 경우에는 512 x 512입니다. |
점 광원은 그림자에 큐브맵을 사용하기 때문에 다른 타입에 비해 크기 제한이 더 낮습니다. 따라서 이 해상도에서 큐브맵 여섯 면을 동시에 비디오 메모리에 유지해야 합니다. 잠재적인 섀도우 캐스터를 큐브맵의 여섯 면에 전부 렌더링해야 할 수 있으므로 렌더링하는 데 상당히 많은 리소스가 필요합니다.
빌트인 렌더 파이프라인의 경우 Light.shadowCustomResolution 프로퍼티를 0보다 큰 값으로 설정하여 광원의 섀도우 맵 해상도를 설정할 수 있습니다. 이 값이 0보다 크면 Unity는 모든 광원 타입에 대해 다음 계산을 수행합니다.
NextPowerOfTwo(shadowCustomResolution)
그런 다음 광원 타입과 하드웨어를 기반으로 최대 해상도를 고정합니다(위 표 참조).
단, shadowCustomResolution
프로퍼티는 빌트인 렌더 파이프라인에서만 지원됩니다. 고해상도 렌더 파이프라인(HDRP) 또는 유니버설 렌더 파이프라인(URP)에서는 지원되지 않습니다.