# 그림자 문제 해결

> Troubleshooting tips for shadow-related issues.

## 그림자 깜박임 줄이기##reduce-shadow-flickering

그림자가 카메라로부터 멀리 떨어져 있으면 깜박일 수 있습니다. 자세한 내용은 [뷰 절두체 이해](/engine/6000.0/manual/working-in-unity/cameras/camera-view/understanding-frustum.md)를 참조하십시오.

그림자가 월드 공간 원점보다 카메라에 더 가까운 경우 카메라 관련 컬링을 활성화합니다. Unity는 월드 공간 원점 대신 카메라를 그림자 계산의 상대적 위치로 사용하여 깜박임을 줄입니다.

카메라 관련 컬링을 활성화하려면 다음 단계를 따르십시오.

1. **Project Settings** > **Graphics** > **Culling Settings** > **Camera-Relative Culling**으로 이동합니다.
2. **Shadows**를 활성화합니다.

## 그림자 성능##shadow-performance

실시간 그림자를 렌더링하면 성능에 큰 영향을 미칩니다. 그림자를 드리울 수 있는 모든 게임 오브젝트는 먼저 섀도우 맵으로 렌더링됩니다. 그런 다음 해당 맵을 사용하여 그림자를 받을 수 있는 오브젝트를 렌더링합니다.

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

복잡한 지오메트리에 대한 실시간 그림자를 렌더링하기에 비용이 너무 많이 드는 경우 낮은 LOD 메시나 기본을 사용하여 그림자를 드리우는 방법도 좋습니다.

이 작업이 리소스를 너무 많이 소모하는 경우 캐릭터 아래의 간단한 메시나 쿼드에 적용된 흐릿한 텍스처를 사용하여 그림자를 진짜처럼 보이게 하거나 커스텀 셰이더가 있는 블롭 섀도우를 만들 수 있습니다.

## 섀도우 애크니##shadow-acne

광원이 직접 비춘 표면은 종종 그림자에 부분적으로 표시될 수 있습니다. 섀도우 맵에서 지정된 거리에 정확하게 존재해야 하는 픽셀이 종종 멀리 있는 것으로 간주되기 때문입니다(섀도우 맵에 저해상도 이미지나 섀도우 필터링을 사용한 결과). 그 결과 비춰질 때 그림자에서 임의 패턴의 픽셀들이 나타나며 '섀도우 애크니'로 알려진 시각적 효과가 발생합니다.


**잘못된 셀프 섀도잉 결함의 섀도우 애크니:**
![](/api/media?file=/engine/6000.0/media/images/ShadowBiasAcne.jpg)

### 그림자 바이어스 설정 조정##adjust-the-shadow-bias-settings

그림자 바이어스 값을 조정하면 섀도우 애크니, 그림자 분리(피터 패닝이라고도 함), 빛 번짐 효과, 셀프 섀도잉과 같은 그림자 결함을 줄이거나 제거할 수 있습니다.

빌트인 렌더 파이프라인에서는 그림자가 활성화된 경우 [**광원 인스펙터**](/engine/6000.0/manual/lighting-overview/lighting-birp/class-light.md) 창의 **Bias** 및 **Normal Bias** 프로퍼티로 이 값을 설정할 수 있습니다.

그림자를 드리우는 게임 오브젝트 근처의 영역이 가끔 잘못 조명을 받기 때문에 **Bias** 값을 너무 높게 설정하지 마십시오. 너무 높게 설정하면 그림자가 연결 해제되어 게임 오브젝트가 지면 위로 날아가는 것처럼 보입니다.


**높은 Bias 값은 그림자가 게임 오브젝트에서 '떨어진' 것처럼 보이게 합니다.:**
![](/api/media?file=/engine/6000.0/media/images/ShadowBiasPeterPanning.jpg)

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


**높은 Normal Bias 값은 그림자 모양을 매우 좁게 만듭니다.:**
![](/api/media?file=/engine/6000.0/media/images/ShadowBiasTooThin.jpg)

경우에 따라 **Normal Bias** 로 인해 근처 지오메트리의 광원이 그림자가 드리워져야 하는 영역으로 번지는 빛 번짐 효과가 원치 않게 발생할 수 있습니다. 잠재적인 해결 방법은 게임 오브젝트의 [Mesh Renderer](/engine/6000.0/manual/working-in-unity/working-with-gameobjects/mesh/components-reference/class-mesh-renderer.md)를 열고 **Cast Shadows** 프로퍼티를 **Two Sided** 로 변경하는 것입니다. 이 방법은 도움이 될 수도 있지만 더 많은 리소스가 필요하고, 씬을 렌더링할 때 성능 오버헤드가 증가할 수 있습니다.

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


**Shadow near plane offset 값이 낮으면 그림자에 구멍 모양이 생깁니다.:**
![](/api/media?file=/engine/6000.0/media/images/ShadowNearOffsetTooLow.jpeg)


**올바른 그림자:**
![](/api/media?file=/engine/6000.0/media/images/ShadowNearOffsetOk.jpg)

### 섀도우 팬케이킹##shadow-pancaking

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


**섀도우 팬케이킹의 원리를 나타내는 다이어그램:**
![](/api/media?file=/engine/6000.0/media/images/PancakingIdea.png)

위 다이어그램에서:

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

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


**큰 삼각형 문제:**
![](/api/media?file=/engine/6000.0/media/images/PancakingProblem.png)

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

이 문제를 피하기 위해 [Quality](/engine/6000.0/manual/unity-editor/editor-features/comp-manager-group/class-quality-settings.md) 창에서 **Shadow Near Plane Offset** 프로퍼티를 미세 조정할 수 있습니다. 이렇게 하면 근거리 클립 평면이 뒤로 당겨집니다. 하지만 이 값을 매우 높게 설정하면 섀도우 맵이 광원 방향에서 처리해야 하는 범위가 증가하기 때문에 결국에는 섀도우 애크니가 발생합니다. 그 대신 그림자를 드리우는 문제가 있는 삼각형을 바둑판 모양으로 만들 수도 있습니다.

## 그림자가 나타나지 않음##shadows-not-appearing

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

* 실시간 그림자는 [Quality](/engine/6000.0/manual/unity-editor/editor-features/comp-manager-group/class-quality-settings.md) 창에서 완전히 비활성화할 수 있습니다. 정확한 품질 레벨이 활성화되었고 해당 설정에서 그림자가 켜졌는지 확인해야 합니다.

* 씬의 모든 [메시 렌더러](/engine/6000.0/manual/working-in-unity/working-with-gameobjects/mesh/components-reference/class-mesh-renderer.md)는 *Receive Shadows* 및 \_Cast Shadows\_를 올바르게 설정해야 합니다. 둘 다 기본적으로 활성화되지만 의도치 않게 비활성화되지 않았는지 확인하십시오.

* 불투명한 오브젝트만 그림자를 드리우고 받으므로 빌트인 [투명](/engine/6000.0/manual/materials-and-shaders/shaders/shader-built-in/built-in-shader-guide/shader-transparent-family.md) 또는 파티클 셰이더를 사용하는 오브젝트는 그림자를 드리우거나 받지 않습니다. 울타리, 초목 등과 같이 ‘간극’이 있는 오브젝트에는 [투명 컷아웃](/engine/6000.0/manual/materials-and-shaders/shaders/shader-built-in/built-in-shader-guide/shader-transparent-cutout-family.md) 셰이더를 대신 사용할 수 있습니다. 커스텀 [셰이더](/engine/6000.0/manual/materials-and-shaders/shaders.md)는 픽셀 조명을 받으며 [지오메트리 렌더 대기열](/engine/6000.0/manual/materials-and-shaders/shaders/reference/sl-reference/sl-sub-shader-object/tags.md)을 사용해야 합니다.

* **VertexLit** 셰이더를 사용하는 오브젝트는 그림자를 받을 수 없지만 드리울 수는 있습니다.

* Unity는 '언릿' 유형의 셰이더가 포함된 머티리얼이 있는 게임 오브젝트에 대해서는 그림자를 계산하지 않습니다. Unity는 조명을 지원하는 셰이더가 포함된 머티리얼의 그림자만 계산할 수 있습니다.

* 빌트인 렌더 파이프라인에서 [포워드 렌더링 경로](/engine/6000.0/manual/rendering-and-post-processing/render-pipelines/built-in-render-pipeline/built-in-rendering-paths/render-tech-forward-rendering.md)를 사용하는 경우(특히 4.x 버전 이후의 Unity 빌트인 셰이더를 사용하는 경우), 일부 셰이더는 가장 밝은 방향 광원만 그림자를 드리울 수 있도록 허용합니다. 그림자를 드리우는 광원을 두 개 이상 사용하려면 대신 [디퍼드 셰이딩](/engine/6000.0/manual/rendering-and-post-processing/render-pipelines/built-in-render-pipeline/built-in-rendering-paths/render-tech-deferred-shading.md) 렌더링 경로를 사용해야 합니다. `fullforwardshadows` [표면 셰이더](/engine/6000.0/manual/materials-and-shaders/shaders/shader-built-in-birp/writing-shaders-birp/writing-surface/sl-surface.md) 지시문을 사용하여 자체 셰이더가 '전체 그림자'를 지원하도록 설정할 수 있습니다.

## 추가 리소스##additional-resources

* [그림자 렌더링 최적화](/engine/6000.0/manual/lighting-overview/lighting/shadows-in-urp/shadows-optimization.md)

* [URP의 그림자 문제 해결](/engine/6000.0/manual/lighting-overview/lighting/shadows-in-urp/shadows-troubleshooting-urp.md)
