고해상도 렌더 파이프라인의 그림자
고해상도 렌더 파이프라인의 광원은 한 게임 오브젝트에서 다른 게임 오브젝트로 그림자를 드리웁니다. 그림자는 게임 오브젝트의 포지션과 스케일을 강조하여 자칫 단조로워 보일 수 있는 씬에 깊이와 사실감을 더합니다.
섀도우 맵 해상도
광원의 섀도우 맵 해상도는 섀도우 맵의 크기를 결정합니다. 섀도우 맵이 클수록 그림자가 더 정밀해지고, 고해상도 렌더 파이프라인(HDRP)이 그림자를 드리우는 지오메트리의 작은 세부 사항을 더 잘 캡처할 수 있습니다. 높은 해상도에서 섀도우 맵을 렌더링하면 더욱 선명하게 보입니다.
Light 컴포넌트의 Shadows 섹션에서 특정 광원의 섀도우 맵 해상도를 설정하십시오.
HDRP가 광원당 렌더링하는 섀도우 맵 수는 다음과 같이 광원 타입에 따라 다릅니다.
- 스폿 광원은 하나의 섀도우 맵을 렌더링합니다.
- 점 광원은 여섯 개의 섀도우 맵(큐브맵의 면 수)을 렌더링합니다.
- 방향 광원은 캐스케이드당 하나의 섀도우 맵을 렌더링합니다. 씬 볼륨의 HD 그림자 설정에서 방향 광원의 캐스케이드 수를 설정합니다. 기본 값은 4개 캐스케이드입니다.
HDRP는 섀도우 아틀라스에서 공간 사용을 최대화하지만 또한 화면의 작은 부분을 차지하는 광원의 성능 영향을 줄이기 위해 섀도우 맵의 크기를 동적으로 다시 조정할 수 있습니다. 이렇게 하려면 HDRP는 빛이 화면의 영역을 덮는 크기에 따라 빛의 섀도우 맵 해상도를 줄입니다. 화면의 영역이 작을수록 HDRP는 Light 컴포넌트에 설정된 값에서 해상도를 더 많이 줄입니다. 이 기능을 활성화하려면 Unity 프로젝트의 HDRP 에셋에 있는 Shadow 섹션으로 이동하여 HDRP가 섀도우 맵 크기를 동적으로 다시 조정할 섀도우 아틀라스의 Dynamic Rescale 프로퍼티를 활성화합니다. HDRP는 캐시된 섀도우 맵에 대해서는 동적으로 크기 재조정을 지원하지 않습니다.
그림자 아틀라스
HDRP는 모든 펑추얼 광원 그림자에 대해 섀도우 맵 아틀라스를 사용하고 방향 광원 그림자에 또 다른 섀도우 맵 아틀라스를 사용하여 프레임의 모든 실시간 그림자를 렌더링합니다.
Unity 프로젝트의 HDRP 에셋에서 이러한 아틀라스의 크기를 설정하십시오. 아틀라스 크기는 씬 내 그림자의 최대 해상도를 결정합니다.
예를 들어 기본 크기의 아틀라스는 4096 x 4096이고, 이는 다음에 해당합니다.
- 1024 x 1024 픽셀의 섀도우 맵 16개
- 2048 x 2048 섀도우 맵 2개, 1024 x 1024 섀도우 맵 4개, 512 x 512 섀도우 맵 8개, 256 x 256 섀도우 맵 32개
화면에 있는 그림자의 최대 수 제어
아틀라스 외에도 HDRP는 단일 프레임에서 렌더링할 수 있는 최대 섀도우 맵 수를 설정할 수도 있습니다. 이렇게 하려면 Unity 프로젝트의 HDRP 에셋을 열고 Shadows 섹션으로 이동한 후 Max Shadows on Screen 값을 입력하십시오. 화면의 섀도우 맵 수가 이 한도보다 많으면 HDRP는 렌더링을 수행하지 않습니다.
그림자 바이어스
섀도우 맵은 본질적으로 광원의 시점에서 투사되는 텍스처입니다. HDRP는 투사에 바이어스를 사용하므로 그림자를 드리우는 지오메트리가 자체 그림자를 생성하지 않습니다.
HDRP에서 각 Light 컴포넌트는 다음 파라미터를 사용하여 자체 그림자 바이어스를 제어합니다.
- Near Plane
- Slope-Scale Depth Bias
- Normal Bias
Shadows 섹션에서 이러한 설정을 찾으십시오. 일부 프로퍼티 필드가 보이지 않으면 more options 기어를 클릭하여 해당 필드를 표시할 수 있습니다. 각 프로퍼티가 그림자 바이어스를 제어하는 방식에 대한 자세한 내용은 광원 문서를 참조하십시오.
높은 그림자 바이어스 값을 사용하면 광원이 메시를 통해 "누출"될 수 있습니다. 이는 그림자와 해당 그림자를 드리우는 오브젝트 사이에 눈에 보이는 간극이 있어 그림자 모양이 해당 그림자를 드리우는 오브젝트를 정확하게 나타내지 못하기 때문입니다.
그림자 필터링
HDRP는 섀도우 맵을 캡처한 후 맵에서 필터링을 처리하여 저해상도 섀도우 맵에서 발생하는 앨리어싱 효과를 줄입니다. 다른 필터는 인식되는 그림자 선명도에 영향을 줍니다.
사용할 그림자 필터 품질을 변경하려면 Unity 프로젝트의 HDRP 에셋에서 Filtering Quality 프로퍼티를 변경합니다. 품질이 높으면 GPU 성능에 영향을 미칩니다. 방향 광원과 펑추얼 광원에 대해 현재 세 가지 필터 품질 프리셋이 있습니다. 사용할 수 있는 필터 품질에 대한 자세한 내용은 필터링 품질표를 참조하십시오.
섀도우 마스크
HDRP는 다음의 두 가지 혼합 조명 모드를 지원합니다.
섀도우 마스크 활성화
HDRP에서 섀도우 마스크를 사용하려면 Unity 프로젝트의 HDRP 에셋에서 섀도우 마스크 지원을 활성화한 후 프레임 설정에서 카메라가 섀도우 마스크를 사용할 수 있도록 해야 합니다.
- Render Pipeline Supported Features에서 Shadowmask 체크박스를 활성화합니다. 그러면 Unity 프로젝트에서 섀도우 마스크에 대한 지원이 활성화됩니다.
- 그런 다음 카메라가 섀도우 마스크를 사용하게 해야 합니다. HDRP 에셋에서 Default Frame Settings > Lighting으로 이동한 후 Shadowmask 체크박스를 활성화하여 카메라가 섀도우 마스크를 기본적으로 사용하도록 설정할 수 있습니다.
HDRP의 특정 설정
유연한 조명 설정을 위해 HDRP는 각 개별 광원에 대해 섀도우 마스크가 동작하는 방식을 선택할 수 있도록 허용합니다. 광원의 Shadowmask Mode를 변경하여 섀도우 마스크의 동작을 변경할 수 있습니다. 광원의 Mode를 Mixed로 설정하여 Shadows 섹션의 Shadow Map 드롭다운에 Shadowmask Mode를 노출하십시오.
Shadowmask Mode | 설명 |
---|---|
Distance Shadowmask | 카메라와 광원 간의 거리가 펑추얼 광원의 Fade Distance보다 짧아지면 광원이 모든 게임 오브젝트에 대해 실시간 그림자를 드리우도록 만듭니다. 방향 광원이 사용하는 대체 거리 프로퍼티에 대해서는 아래를 참조하십시오. 광원과 카메라 간의 거리가 Fade Distance보다 길어지면 HDRP는 광원에 대한 실시간 그림자 계산을 중지합니다. 대신에 정적 게임 오브젝트에 섀도우 마스크를 사용하고, 비정적 게임 오브젝트는 그림자를 드리우지 않습니다. |
Shadowmask | 광원이 비정적 게임 오브젝트에 대해서만 실시간 그림자를 드리우도록 만듭니다. 그런 다음 광원과 카메라 간의 거리가 Fade Distance보다 짧아지면 해당 그림자와 정적 게임 오브젝트에 대한 섀도우 마스크와 결합합니다. 광원과 카메라 간의 거리가 Fade Distance보다 길어지면 HDRP는 광원에 대한 실시간 그림자 계산을 중지합니다. 대신에 정적 게임 오브젝트에 섀도우 마스크를 사용하고, 비정적 게임 오브젝트는 그림자를 드리우지 않습니다. |
방향 광원은 Fade Distance를 사용하지 않고, 대신에 씬 볼륨의 HD 그림자 설정에 있는 Max Distance 프로퍼티를 사용합니다.
Distance Shadowmask는 GPU 성능을 더 많이 소모하지만, 광원과 가까이 있는 실시간 조명이 멀리 떨어진 영역을 표현하기 위해 선택된 저해상도 섀도우 마스크 텍스처보다 더 정확하기 때문에 더욱 사실적으로 보입니다.
Shadowmask는 메모리를 더 많이 소모하는데, 이는 카메라가 카메라와 가까이 있는 정적 게임 오브젝트에 섀도우 마스크 텍스처를 사용하기 때문입니다. 이 경우 더 높은 해상도의 섀도우 마스크 텍스처가 필요합니다.
그림자 업데이트 모드
Update Mode를 사용하여 HDRP가 광원 섀도우 맵을 업데이트하는 데 사용하는 계산 방법을 지정합니다. 다음의 업데이트 모드가 사용 가능합니다.
Update Mode | 설명 |
---|---|
Every Frame | HDRP는 모든 프레임마다 광원의 섀도우 맵을 업데이트합니다. |
On Enable | HDRP는 게임 오브젝트를 활성화할 때마다 광원에 대한 섀도우 맵을 업데이트합니다. |
On Demand | HDRP는 요청할 때마다 광원에 대한 섀도우 맵을 업데이트합니다. 이렇게 하려면 광원의 HDAdditionalLightData 컴포넌트의 RequestShadowMapRendering() 함수를 호출합니다. |
고해상도 렌더 파이프라인(HDRP)은 그림자 캐싱을 사용하여 광원에 대한 섀도우 맵을 불필요하게 업데이트하지 않음으로써 성능을 높입니다. HDRP에는 특히 캐시된 펑추얼 광원과 캐시된 면 광원에 대한 별도의 섀도우 아틀라스뿐 아니라 펑추얼 광원, 면 광원, 방향 광원에 대한 섀도우 아틀라스도 있습니다. 캐시된 방향 광원의 경우 노멀 방향 광원과 동일한 아틀라스를 사용합니다. 광원의 Update Mode는 HDRP의 섀도우 맵 캐싱 여부를 결정합니다. 광원의 Update Mode를 OnEnable이나 OnDemand로 설정하는 경우 HDRP는 광원의 섀도우 맵을 캐싱합니다. 광원의 Update Mode를 Every Frame으로 설정하는 경우 HDRP는 광원의 섀도우 맵을 캐싱하지 않습니다. 해당 그림자를 캐싱하는 광원이 처음으로 해당 섀도우 맵을 렌더링하면 HDRP는 이를 캐시된 섀도우 아틀라스에 섀도우 맵을 할당하는 캐시된 그림자 관리자에 등록합니다. 방향 광원의 경우 HDRP는 캐싱되거나 캐싱되지 않은 방향 광원에 동일한 섀도우 아틀라스를 사용합니다.
광원의 Update Mode를 OnDemand로 설정하면 HDRP가 광원의 섀도우 맵을 업데이트하도록 수동으로 요청할 수 있습니다. 이렇게 하려면 광원의 HDAdditionalLightData 컴포넌트에 액세스하여 RequestShadowMapRendering
함수를 호출합니다. 또한 광원에 여러 그림자(예: 방향 광원의 여러 캐스케이드)가 있는 경우 특정 하위 그림자의 업데이트를 요청할 수도 있습니다. 이렇게 하려면 RequestSubShadowMapRendering(shadowIndex)
함수를 사용합니다.
자체 그림자를 캐싱하는 광원의 경우 이를 비활성화하거나 해당 광원의 Update Mode를 Every Frame으로 설정하는 경우 HDRP가 광원의 섀도우 맵 위치를 캐시된 섀도우 아틀라스에 보존하도록 지시할 수 있습니다. 즉 광원을 다시 활성화하면 HDRP는 섀도우 맵을 다시 렌더링하거나 이를 섀도우 아틀라스에 배치하지 않아도 됩니다. 광원이 캐시된 섀도우 아틀라스에 자체 섀도우 맵의 위치를 보존하게 하는 방법에 대한 자세한 내용은 섀도우 아틀라스 위치 보존을 참조하십시오.
일반적인 사례의 경우 손쉬운 방법으로 HDRP는 광원의 포지션이나 회전이 특정 임계값 이상으로 변경되면 자동으로 업데이트를 트리거하는 옵션을 제공합니다. 이 옵션을 활성화하려면 Light를 선택하여 해당 인스펙터의 Shadow 섹션에서 Update on light movement를 활성화합니다.
HDRP가 광원이 업데이트를 트리거하기 위해 이동하거나 회전해야하는 양을 결정하는 데 사용할 임계값을 커스터마이즈할 수 있습니다. 임계값을 커스터마이즈하려면 광원의 HDAdditionalLightData 컴포넌트에 있는 cachedShadowTranslationUpdateThreshold
와 cachedShadowAngleUpdateThreshold
프로퍼티를 사용합니다. 점 광원은 이 모드에서 업데이트 수행 여부를 결정할 때 각도 차이를 무시합니다.
그림자 캐싱 커스터마이즈
HDRP는 펑추얼 광원은 한 아틀라스로, 면 광원은 다른 아틀라스로, 방향 광원은 캐싱되지 않은 방향 광원과 동일한 아틀라스로 섀도우 맵을 캐싱합니다. 처음 두 개의 캐시된 섀도우 아틀라스의 해상도는 서로 독립적으로 변경할 수 있습니다. 이렇게 하려면 다음 단계를 따르십시오.
- HDRP 에셋을 선택하여 인스펙터에서 확인합니다.
- 펑추얼 광원의 경우 Lighting > Shadows > Punctual Light Shadows로 이동합니다. 면 광원의 경우는 Lighting > Shadows > Area Light Shadows로 이동합니다.
- Cached Shadow Atlas Resolution에 대한 값을 원하는 값으로 설정합니다. 섀도우 아틀라스 구성에 도움이 될 수 있도록 개별 섀도우 맵의 해상도를 64 배수로 유지해야 합니다. 최적으로 구성할 수 있도록 동일한 해상도를 가능한 한 많은 섀도우 맵에 설정합니다.
광원이 스폿을 요청할 때 섀도우 아틀라스가 가득찬 경우 캐시된 섀도우 관리자는 광원의 섀도우 맵을 추가하지 않으므로 광원은 그림자를 드리우지 않습니다. 즉 사용 가능한 공간 관리가 중요합니다. 광원이 섀도우 아틀라스에 들어갈 수 있는지 확인하기 위해 HDCachedShadowManager.instance.WouldFitInAtlas
헬퍼 함수를 사용할 수 있습니다. 광원이 이미 아틀라스에 위치가 있는지 또는 배치되길 대기 중인지 확인하기 위해 Render Pipeline Debug 창에 캐시된 섀도우 아틀라스의 상태를 기록하는 옵션이 포함되어 있습니다. 이 옵션을 사용하려면 다음 단계를 따르십시오.
- 메뉴: Window > Render Pipeline > Render Pipeline Debug를 클릭합니다.
- Lighting > Shadows로 이동합니다.
- Log Cached Shadow Atlas Status 버튼을 클릭합니다. 이렇게 하면 광원이 아틀라스에 위치가 있는지 아니면 배치되길 대기 중인지 설명하는 콘솔 창에 메시지를 출력합니다.
씬이 이미 배치된 모든 광원과 함께 로드된 후 캐시된 그림자가 있는 새로운 광원을 씬에 추가하려면 HDRP는 아틀라스의 구멍을 채우기 위해 이를 배치하려고 합니다. 하지만 삽입 순서에 따라 아틀라스가 해체될 수도 있고 사용 가능한 구멍이 광원의 섀도우 맵에 배치되기에 충분하지 않을 수 있습니다. 이러한 경우 추가 광원을 허용하기 위해 아틀라스 조각을 모을 수 있습니다. 이렇게 하려면 타겟 아틀라스를 HDCachedShadowManager.instance.DefragAtlas
함수로 전달해야 합니다.
이렇게 하면 HDRP가 아틀라스의 모든 섀도우 맵을 더러워졌다고 표시하며 즉 HDRP는 해당 부모 광원이 표시될 때 섀도우 맵을 렌더링합니다.
섀도우 아틀라스 위치 보존
광원을 비활성화하거나 Update Mode를 Every Frame으로 변경하는 경우 캐시된 섀도우 관리자는 캐시된 섀도우 아틀라스에 광원의 섀도우 맵 공간을 따로 보유하지 않으며 HDRP는 모든 프레임마다 광원의 섀도우 맵을 노멀 섀도우 아틀라스로 렌더링하기 시작합니다. 캐시된 섀도우 관리자가 다른 광원을 위해 아틀라스에 공간을 할당해야 하는 경우 현재 기존의 광원 섀도우 맵이 차지한 공간에 덮어쓸 수 있습니다.
일시적으로만 광원의 Update Mode를 Every Frame으로 설정하고 나중에 On Enable이나 On Demand로 되돌리고자 하는 경우 해당 아틀라스 안에 광원의 섀도우 맵 위치를 보존할 수 있습니다. 이는 예를 들어 HDRP가 멀리 있는 광원의 섀도우 맵을 캐시하고자 하지만 카메라에 가까워지면 모든 프레임마다 해당 섀도우 맵을 업데이트하려는 경우에 유용합니다. 이렇게 하려면 광원의 HDAdditionalLightData 컴포넌트에 액세스하여 preserveCachedShadow 프로퍼티를 활성화합니다. 이 프로퍼티가 true
로 설정되어 있는 경우 HDRP는 광원의 섀도우 맵 공간을 해당 섀도우 아틀라스에 보존합니다. 이 프로퍼티가 활성화되어 있더라도 광원을 파괴하면 섀도우 아틀라스에 있는 해당 위치는 상실됩니다.
참고
Unity 에디터에 있는 동안 섀도우 맵을 드리우는 광원을 수정할 때마다 HDRP는 섀도우 맵을 업데이트합니다. 빌드된 애플리케이션에서 광원의 다른 프로퍼티를 변경하거나 다음의 함수 중 하나를 호출할 때 HDRP는 캐시된 섀도우 맵을 새로 고침합니다.
- SetShadowResolution()
- SetShadowResolutionLevel()
- SetShadowResolutionOverride()
- SetShadowUpdateMode() 또는 shadowUpdateMode. 이 경우 HDRP는 모드가 Every Frame과 비 Every Frame 사이에서 변경되면 캐시된 섀도우 맵을 새로 고침합니다.
뷰에 종속되는 모든 것은 메인 뷰가 이동하는 대로 HDRP가 이에 종속된 것을 자동으로 업데이트하지 않기 때문에 캐시된 섀도우 맵에 문제를 일으킬 가능성이 있습니다. 여기에 대해 명확하지 않은 예가 테셀레이션입니다. 테셀레이션 팩터는 뷰에 종속하기 때문에 메인 카메라가 보는 지오메트리는 HDRP가 캐시된 섀도우 맵으로 렌더링하는 지오메트리와 일치하지 않을 수 있습니다. 이러한 문제가 눈에 띄게 발생할 경우 HDRP에 광원의 섀도우 맵 업데이트 요청을 트리거해야 합니다. 이렇게 하려면 광원의 Update Mode가 On Demand로 설정되어 있어야 하며 RequestShadowMapRendering
을 호출해야 합니다.
컨택트 그림자
컨택트 그림자는 HDRP가 스크린 공간에서, 뎁스 버퍼 내에서, 가까운 거리에서 레이 마칭을 적용하는 그림자입니다. 이 타입의 그림자는 섀도우 맵이 대개 캡처하지 못하는 지오메트리의 디테일에 대한 작고 상세한 그림자를 제공합니다.
컨택트 그림자를 활성화하고 커스터마이즈하는 자세한 방법은 컨택트 그림자 오버라이드 문서를 참조하십시오.
한 번에 하나의 광원만 컨택트 그림자를 드리울 수 있습니다. 즉 화면에 컨택트 그림자를 드리우는 광원이 두 개 이상 있는 경우 지배적인 광원만 컨택트 그림자를 렌더링합니다. HDRP는 광원 바운딩 박스의 스크린 공간 크기를 사용하여 우세한 광원을 선택합니다. 컨택트 그림자를 드리우는 방향 광원은 항상 우세한 광원입니다.