Shadow Size Computation

Desktop!

유니티는 shadow map 크기를 아래와 같은 방법으로 계산합니다:

첫째로 화면에 빛의 "coverage box" 가 계산 됩니다. 이것은 빛이 비추는 화면의 다음을 위한 사각형 입니다:

  • 전체 화면의 방향성을 가진 빛.
  • 화면에 뿌려지는 빛의 피라미드의 반사되는 사각형의 지점(Spot) 빛.
  • 화면에 뿌려지는 빛의 구에서 반사되는 사각형의 점(Point) 빛.

그리고 이 상자의 가로, 세로, 높이의 큰 값이 선택되고 pixel size를 부릅니다.

"High" 그림자 해상도, 그림자 맵의 크기 그리고:

  • 방향 빛(Directional) 빛: NextPowerOfTwo( pixel size * 1.9 ), 2048보다 크지 않게.
  • 지점 빛(Spot) 빛: NextPowerOfTwo( pixel size ), 1024보다 크지 않게.
  • 점 빛(Point) 빛: NextPowerOfTwo( pixel size * 0.5 ), 512보다 크지 않게.

그래픽 카드가 512MB 이상의 메모리를 가지고 있을 때는 그림자 맵의 최고 한도가 증가 합니다 (방향은 4096, 지점은 2048, 점 빛은1024).

"중간" 그림자 해상도에서는 그림자 맵 크기가 "높은" 해상도에서보다 두배 작습니다. "낮은" 해상도에서는 네배 더 작습니다.

점 빛의 작은 한계는 그것이 그림자를 위해서 cubemap을 사용하기 때문입니다. 즉, cubemap의 여섯면은 비디오 메모리에 존재해야만 합니다. 그것은 잠재적인 그림자 주조기가 cubemap의 여섯면이 렌더되야 하기 때문에 꽤 렌더하기 비쌉니다.

메모리 한계에 다가갔을 때의 그림자 크기 계산

비디오 메모리의 한계에 다다랐을 때, 유니티는 위에서 계산된 그림자맵 해상도를 자동으로 낮춥니다.

보통 화면(backbuffer, frontbuffer, depth buffer)을 위한 메모리는 비디오 메모리에 존재하여야 하며 텍스쳐 렌더도 비디오 메모리에 존재하여야 합니다. 유니티는 이 두가지를 그림자 맵의 메모리 이용을 결정하는데 사용합니다. 위에서 계산된 그림자 맵의 크기에따라 배치가 될때 그 크기는 (TotalVideoMemory - ScreenMemory - RenderTextureMemory) / 3에 맞도록 크기가 줄어들 것입니다.

모든 보통의 텍스쳐, 꼭지점 데이터 그리고 다른 그래픽 객체가 비디오 메모리에서 스왑될 수 있다고 가정하면 그림자 맵에 의해 사용될수 있는 최대 VRAM은 (TotalVideoMemory-ScreenMemory-RenderTextureMemory)입니다. 그러나 화면과 텍스쳐 렌더에 사용되는 메모리의 정확한 크기는 결정될 수 없으며 어떤 객체는 스왑되어 나올 수 없으며 모든 텍스쳐가 지속적으로 스왑되어 들어오고 나간다면 최악의 성능을 보여줄 것입니다. 그리서 유니티는 그림자 맵이 "보통 사용 가능한" 비디오 메모리의 삼분의 일 이상을 사용할 수 없게하며 이것을 실제 잘 작동합니다.

iOS!

현재 iOS 플랫폼에서는 지원되지 않습니다.

Android!

< 현재 안드로이드 플랫폼에서는 지원되지 않습니다.

역링크