광원은 다음 두 가지 방법 중 하나로 렌더링할 수 있습니다.
버텍스 조명(Vertex lighting)은 메시의 버텍스에서만 조명을 계산하고 버텍스 값을 나머지 표면에 보간합니다. 일부 조명 효과는 버텍스 조명으로 지원되지 않지만, 두 방법 중 프로세싱 오버헤드 측면에서는 더 저렴합니다. 또한 이 방법은 구형 그래픽 카드에서 이용할 수 있는 유일한 방법일 수도 있습니다.
픽셀 조명(Pixel lighting)은 모든 화면 픽셀에서 별도로 계산됩니다. 렌더링 속도는 더 느리지만, 픽셀 조명을 사용하면 버텍스 조명을 통해 만들 수 없는 몇 가지 효과를 낼 수 있습니다. 노멀 매핑, 광원 쿠키 및 실시간 그림자는 픽셀 조명에서만 렌더링됩니다. 또한 스폿 광원의 모양 및 점 광원 하이라이트도 픽셀 모드로 렌더링하면 훨씬 더 좋게 보입니다.
광원은 렌더링 속도에 크게 영향을 미치므로 조명 품질과 프레임 속도 사이에서 균형을 찾아야 합니다. 픽셀 광원은 버텍스 광원보다 렌더링하는 데 훨씬 더 많은 리소스가 사용되므로 Unity에서는 가장 밝은 광원만 픽셀 단위 품질로 렌더링하고 나머지는 버텍스 광원으로 렌더링합니다. 스탠드얼론 빌드 타겟에 대한 최대 픽셀 광원의 수는 품질 설정에서 설정할 수 있습니다.
광원이 렌더 모드(Render Mode) 프로퍼티를 사용하여 픽셀 광원으로 렌더링되게 하고 싶을 수 있습니다. 픽셀 광원으로 렌더링할지 결정할 때는 모드가 중요(Important)로 설정된 광원에 더 높은 우선 순위가 부여됩니다. 모드가 자동(Auto)(기본값)으로 설정된 경우 Unity는 오브젝트가 광원에 얼마나 영향을 받느냐에 따라 광원을 자동으로 분류합니다. 픽셀 광원으로 렌더링되는 광원은 오브젝트별로 결정됩니다.
자세한 내용은 그래픽스 성능 최적화 페이지를 참조하십시오.
실시간 그림자는 렌더링하는 데 꽤 많은 리소스가 사용되므로 신중하게 사용해야 합니다. 그림자를 캐스트할 수 있는 오브젝트는 먼저 섀도우 맵 안에 렌더링되어야 하고, 그런 다음 해당 맵이 그림자를 받을 수 있는 오브젝트를 렌더링하는 데 사용됩니다. 그림자를 활성화하면 위에서 언급한 픽셀/버텍스 기반 조명간 균형보다 성능에 더욱 많은 영향을 미칩니다.
소프트 섀도우는 하드 섀도우보다 렌더링하는 데 리소스가 더 많이 사용되지만, GPU에만 영향을 미치고 추가 CPU 작업은 많이 유발하지 않습니다.
품질 설정에는 그림자 거리(Shadow Distance) 값이 있습니다. 카메라에서 이 거리보다 멀리 떨어져 있는 오브젝트는 그림자가 전혀 없이 렌더링됩니다. 멀리 있는 오브젝트의 그림자는 일반적으로 눈에 띄지 않으므로 이 설정값을 사용하면 렌더링해야 하는 그림자 수를 줄일 수 있어 유용합니다.
방향 광원의 중요한 문제 중 하나는 광원 하나가 씬 전체에 조명을 비출 수 있다는 점입니다. 따라서 섀도우 맵이 종종 씬의 커다란 부분을 한꺼번에 덮고 이로 인해 그림자가 “원근 앨리어싱(Perspective aliasing)”이라는 문제에 취약해집니다. 원근 앨리어싱은 간단히 말해 카메라 가까이에 보이는 섀도우 맵 픽셀이 멀리 있는 것에 비해 더 크고 덩어리져 보임을 의미합니다. 이 효과를 줄이기 위해 간단히 섀도우 맵 해상도를 높일 수 있지만, 그러면 섀도우 맵이 더 낮은 해상도에서 문제 없이 표시되었던 멀리 있는 영역의 렌더링 리소스가 낭비됩니다.
따라서 카메라에서 거리가 멀어질수록 해상도가 낮아지는 별도의 섀도우 맵을 사용하면 이 문제를 해결하는 좋은 방법이 될 수 있습니다. 이런 별도의 맵을 캐스케이드(cascades)라고 합니다. 품질 설정에서 캐스케이드를 0개, 2개 또는 4개 선택할 수 있습니다. Unity는 카메라 절두체 안의 캐스케이드 포지셔닝을 계산합니다. 캐스케이드는 방향 광원에만 활성화됩니다. 자세한 내용은 방향 광원 섀도우 페이지를 참조하십시오.
맵 크기 계산의 첫 단계로 씬 뷰에서 광원으로 조명을 비출 수 있는 영역을 결정합니다. 방향 광원의 경우 전체 화면에 조명을 비출 수 있지만, 스폿 광원 및 점 광원의 경우 영역은 광원 범위 모양(점 광원의 경우 구체, 스폿 광원의 원뿔)을 화면에 투사합니다. 투사된 모양은 화면에 특정 너비 및 높이(픽셀 단위)로 표시됩니다. 두 값 중 큰 값이 광원의 “픽셀 크기”로 사용됩니다.
섀도우 맵 해상도가 (품질 설정에서) 고해상도(High Resolution)으로 설정된 경우 섀도우 맵의 크기는 다음과 같이 계산됩니다.
그래픽 카드의 비디오 메모리가 512MB 이상인 경우, 섀도우 맵 상한은 방향 광원의 경우 4096, 스폿 광원의 경우 2048, 점 광원의 경우 1024까지 증가합니다.
중간 해상도(Medium Resolution) 그림자 해상도에서 섀도우 맵 크기는 고해상도 값의 절반이며, 저해상도(Low Resolution) 의 1/4 크기입니다.
점 광원은 그림자에 큐브맵을 사용하기 때문에 다른 타입에 비해 크기 제한이 더 낮습니다. 따라서 이 해상도에서 큐브맵 여섯 면을 동시에 비디오 메모리에 유지해야 합니다. 잠재적인 섀도우 캐스터를 큐브맵의 여섯 면에 전부 렌더링해야 할 수 있으므로 렌더링하는 데 상당히 많은 리소스가 필요합니다.
하나 이상의 오브젝트가 그림자를 캐스트하지 않는다면 다음 사항을 확인해야 합니다.
구형 그래픽스 하드웨어는 그림자를 지원하지 않을 수 있습니다. 아래에서 그림자를 처리할 수 있는 최소 하드웨어 사양 리스트를 확인해야 합니다.
품질 설정에서 그림자를 비활성화할 수 있습니다. 정확한 품질 레벨이 활성화되었고 해당 설정에서 그림자가 켜졌는지 확인해야 합니다.
씬의 모든 메시 렌더러의 그림자 받기(Receive Shadows) 및 그림자 드리우기(Cast Shadows) 를 올바르게 설정해야 합니다 둘 모두 기본적으로 활성화되어 있지만 의도치 않게 비활성화되지 않았는지 확인해야 합니다.
불투명한 오브젝트만 그림자를 캐스트하고 받기 때문에 빌트인 투명 또는 파티클 셰이더를 사용하는 오브젝트는 그림자를 캐스트하거나 받지 않습니다. 일반적으로 펜스, 초목처럼 틈이 있는 오브젝트 대신 투명 컷아웃 셰이더를 사용할 수 있습니다. 커스텀 셰이더는 픽셀에서 조명을 받고 지오메트리 렌더 대기열을 사용해야 합니다.
버텍스 릿(VertexLit) 셰이더를 사용하는 오브젝트는 그림자를 받을 수 없지만 캐스트할 수는 있습니다.
포워드 렌더링 경로에서 일부 셰이더를 사용하는 경우(특히 4.x 버전 이후의 Unity 레거시 빌트인 셰이더를 사용하는 경우) 가장 밝은 방향 광원만 그림자를 캐스트할 수 있습니다. 그림자를 캐스트하는 광원을 하나 이상 원하는 경우, 디퍼드 셰이딩 렌더링 경로를 대신 사용해야 합니다. fullforwardshadows
표면 셰이더 명령을 사용하여 직접 작성한 셰이더가 “전체 그림자”를 지원하게 설정할 수 있습니다.
빌트인 그림자는 Unity에서 지원되는 거의 모든 디바이스에 사용할 수 있습니다. 다음 카드는 각 플랫폼에서 지원됩니다.
GL_OES_depth_texture
지원이 필요합니다. 특히 이를 지원하지 않는 일부 Android Tegra 2/3 기반 Android 디바이스는 그림자를 지원하지 않습니다.