Version: 2019.4
Shadow Cascades
The Lighting window

Shadow troubleshooting

Shadow performance

Real-time shadows have quite a high rendering overhead; any GameObjects that might cast shadows must first be rendered into the shadow map and then that map will be used to render objects that might receive shadows.

소프트 섀도우는 하드 섀도우보다 렌더링하는 데 리소스가 더 많이 사용되지만, GPU에만 영향을 미치고 추가 CPU 작업은 많이 유발하지 않습니다.

Shadow acne

A surface directly illuminated by a Light sometimes appears to be partly in shadow. This is because pixels that should be exactly at the distance specified in the shadow map are sometimes calculated as being further away (this is a consequence of using shadow filtering, or a low-resolution image for the shadow map). The result is arbitrary patterns of pixels in shadow when they should be lit, giving a visual effect known as “shadow acne”.

잘못된 자체 그림자 결함의 섀도우 애크니
잘못된 자체 그림자 결함의 섀도우 애크니

The Bias property

섀도우 애크니를 방지하기 위해 섀도우 맵에 Bias 값을 거리에 추가하여 경계선의 픽셀이 통과해야 하는 비교를 명확하게 하거나 섀도우 맵에 렌더링할 때 노멀을 따라 게임 오브젝트를 일부 삽입하도록 할 수 있습니다. 이 값들은 그림자가 활성화될 때 광원 인스펙터 창의 BiasNormal Bias 프로퍼티에 의해 설정됩니다.

경우에 따라 그림자를 캐스트하는 게임 오브젝트 근처에 그림자 주변 영역이 잘못 비춰지므로 Bias 값을 너무 높게 설정하지 말아야 합니다. 이렇게 하면 그림자가 분리되어 게임 오브젝트가 지면 위를 나는 것처럼 보이게 됩니다.

높은 Bias 값은 그림자가 게임 오브젝트에서 떨어진 것처럼 보이게 합니다.
높은 Bias 값은 그림자가 게임 오브젝트에서 “떨어진” 것처럼 보이게 합니다.

이와 유사하게, Normal Bias 값이 너무 높게 설정되면 게임 오브젝트의 그림자가 매우 좁게 표시됩니다.

높은 Normal Bias 값은 그림자 형태를 매우 좁게 만듭니다.
높은 Normal Bias 값은 그림자 형태를 매우 좁게 만듭니다.

경우에 따라 Normal Bias 로 인해 근처 지오메트리의 광원이 그림자가 캐스트되어야 하는 영역으로 번지는 “광원 번짐”이라 불리는 효과가 발생할 수 있습니다. 잠재적인 해결 방법은 게임 오브젝트의 메시 렌더러를 열고 Cast Shadows 프로퍼티를 Two Sided 로 변경합니다. 이 방법은 도움이 될 수도 있지만 더 많은 리소스가 필요하고, 씬을 렌더링할 때 성능 오버헤드가 증가할 수 있습니다.

원하지 않는 효과가 발생하지 않도록 하려면 광원용 바이어스 값을 미세 조정해야 합니다. 일반적으로 계산하기 보다 눈대중으로 적절한 값을 찾는 편이 더 수월합니다.

올바른 그림자 사용
올바른 그림자 사용

Shadow pancaking

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

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

위 다이어그램에서

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

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

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

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

You can tweak the Shadow Near Plane Offset property from the Quality window to avoid this problem. This pulls back the near clip plane. However, setting this value very high eventually introduces shadow acne, because it raises the range that the shadow map needs to cover in the light direction. Alternatively, you can also tesselate the problematic shadow casting triangles.

Shadows not appearing

하나 이상의 오브젝트가 그림자를 캐스트하지 않는다면 다음 사항을 확인해야 합니다.

  • Real-time shadows can be disabled completely in the Quality window. Make sure that you have the correct quality level enabled and that shadows are switched on for that setting.

  • 씬의 모든 메시 렌더러그림자 받기(Receive Shadows)그림자 드리우기(Cast Shadows) 를 올바르게 설정해야 합니다 둘 모두 기본적으로 활성화되어 있지만 의도치 않게 비활성화되지 않았는지 확인해야 합니다.

  • 불투명한 오브젝트만 그림자를 캐스트하고 받기 때문에 빌트인 투명 또는 파티클 셰이더를 사용하는 오브젝트는 그림자를 캐스트하거나 받지 않습니다. 일반적으로 펜스, 초목처럼 틈이 있는 오브젝트 대신 투명 컷아웃 셰이더를 사용할 수 있습니다. 커스텀 셰이더는 픽셀에서 조명을 받고 지오메트리 렌더 대기열을 사용해야 합니다.

  • 버텍스 릿(VertexLit) 셰이더를 사용하는 오브젝트는 그림자를 받을 수 없지만 캐스트할 수는 있습니다.

  • Unity can’t calculate shadows for GameObjects that have materials with “Unlit” type shaders. Unity can only calculate shadows for materials with shaders that support lighting.

  • In the Built-in Render Pipelne, using the Forward rendering path, some shaders allow only the brightest directional light to cast shadows (in particular, this happens with Unity’s legacy built-in shaders from 4.x versions). If you want to have more than one shadow-casting light then you should use the Deferred Shading rendering path instead. You can enabled your own shaders to support “full shadows” by using the fullforwardshadows surface shader directive.

Shadow Cascades
The Lighting window