디스턴스 필드 앰비언트 오클루전

메시 디스턴스 필드를 사용하여 스카이라이트에 다이내믹 앰비언트 오클루전 효과를 내는 법에 대한 개요입니다.

Choose your operating system:

Windows

macOS

Linux

DistanceFieldAmbientOcclusion_Header.jpg

무버블 스카이 라이트에 대한 그림자는 각 스태틱 메시마다 미리 계산하는 Signed Distance Field Volume (부호화 디스턴스 필드 볼륨)을 사용하여 중간 스케일 앰비언트 오클루전을 생성하는 것으로 이루어집니다. 언리얼 엔진 4 (UE4) 에서 이는 디스턴스 필드 앰비언트 오클루전 (DFAO) 라 합니다. 동적인 씬 변화를 지원하므로, 스태틱 메시를 옮기거나 숨기면 오클루전에 영향을 줍니다. 스크린 스페이스 앰비언트 오클루전 (SSAO) 과는 달리, 오클루전 계산이 월드 스페이스 오클루더에서 일어나므로, 화면 밖으로 나간 데이터로 인한 부작용이 없습니다.

이 다이내믹 AO 솔루션은 모든 프로젝트에 통하지는 않는데, 동적인 씬 변화를 지원하기 위해 약간의 침습성 한계가 있기 때문입니다. 특히나 비균등 스케일(찌부러짐)은 약간만 지원됩니다. 또한 커다란 스태틱 메시는 퀄리티가 안좋게 나오는데, 작은 볼륨 텍스처가 모든 오브젝트에 매핑되기 때문입니다.

씬 구성

이 기능은 프로젝트 세팅 Rendering (렌더링) 섹션 아래 Generate Mesh Distance Fields (메시 디스턴스 필드 생성) 옵션을 켜야 합니다. 자세한 정보는 메시 디스턴스 필드 문서를 참고하세요.

디스턴스 필드 앰비언트 오클루전을 켜려면, Sky Light (스카이 라이트)를 끌어 씬에 놓고 모빌리티를 무버블 로 설정합니다.

단계별 안내서로 디스턴스 필드 앰비언트 오클루전 사용법 문서를 참고하시기 바랍니다.

스카이 라이트

Sky Light 컴포넌트에서는 Distance Field Ambient Occlusion (디스턴스 필드 앰비언트 오클루전) 아래 나열된 다양한 세팅을 조절할 수 있습니다. 조절할 수 있는 세팅 몇 가지에 대한 비교입니다:

Occlusion Contrast

Occlusion | Contrast: 0

Occlusion | Contrast: 1

Minimum Occlusion

Min Occlusion: 0

Min Occlusion: 1

Occlusion Tint

Occlusion Tint: | Black

Occlusion Tint: | Red

스카이 라이트 세팅 및 추가 예제 관련 정보는 메시 디스턴스 필드 세팅 레퍼런스 문서를 참고하세요.

씬 표현

디스턴스 필드 AO 에 대한 뷰 모드를 통해 다른 라이팅 현상과 관계 없이 레벨에 DFAO 가 어때 보이는지를 확인할 수 있습니다.

씬 앰비언트 오클루전을 나타내는 디스턴스 필드 시각화는 레벨 뷰포트의 뷰 모드 중 표시 > 시각화 > Distance Fields Ambient Occlusion (디스턴스 필드 앰비언트 오클루전)을 선택하면 됩니다.

DFAOVisualize.png

이 뷰모드에서 영향을 주는 유일한 스카이 라이트 세팅 Occlusion Max Distance (오클루전 최대 거리) 입니다.

DFAOView.png

퀄리티

디스턴스 필드 AO 퀄리티는 그것이 표현하는 메시 디스턴스 필드의 해상도로 결정됩니다. AO 는 매우 연한 그림자이므로, 표면이 제대로 표현되지 않는다 해도, 오클루전이 발생하는 위치가 표면에서 멀 수록 정확할 것입니다. 스카이 오클루전에는 종종 눈에 띄지 않습니다. 하지만 메시 디스턴스 필드에 메시의 커다란 디테일이 잘 표현되도록 해야 결과가 좋습니다. 퀄리티를 조사하려면 메시 디스턴스 필드 시각화 를 사용하면 됩니다.

메시 디스턴스 필드 퀄리티 관련 상세 정보는 메시 디스턴스 필드 문서를 참고하세요.

결과

디퓨즈

DFAO (디스턴스 필드 앰비언트 오클루전)은 오클루전 팩터와 함께 스카이라이트 디퓨즈 계산을 변경하는 데 사용되는 (최소 오클루전 방향) 굽은 노멀을 생성합니다.

No Distance Field Ambient Occlusion

Distance Field Ambient Occlusion

포트나이트에서 한낮의 레벨입니다. 포트나이트에서 플레이어는 어떤 벽, 바닥, 천정이든 부순 다음 새로 세울 수 있으므로, 라이팅도 그에 맞게 업데이트되어야 합니다. DFAO 는 레벨에서 자신 주변의 이러한 동적인 유형의 변화를 지원합니다.

포트나이트의 레벨 예제로, 에디터에서 애셋을 숨기고 이동함에 따라 AO 가 실시간 업데이트되고 있습니다.

스페큘러

DFAO 는 스카이라이트에 추정된 스페큘러 오클루전을 제공하기도 합니다. 이는 (머티리얼 러프니스에 따라 크기가 달라지는) 리플렉션 콘과 디렉셔널 오클루전 콘을 교차시켜 계산합니다.

No Specular Occlusion

Specular Occlusion

파이프의 스페큘러 오클루전입니다.

기본적으로 스페큘러에는 방향성이 없는 AO 가 적용됩니다. r.AOSpecularOcclusionMode 를 사용하면 리플렉션 원뿔과 DFAO 로 생성된 미차폐 원뿔을 교차시키는 방식으로 기본 방식보다 정확한 오클루전 결과를 낼 수 있습니다. 참고로 이 방식은 DFAO 샘플링 부작용이 생길 수 있습니다.

폴리지

폴리지 툴 로 칠한 액터의 경우, 먼저 툴 세팅에서 Affect Distance Field Lighting (디스턴스 필드 라이팅에 영향) 옵션을 켜줘야 합니다.

FoliageToolSettings.png

DFAO 가 표면에서 작동하기는 하지만, 여러 장의 작은 나뭇잎이 시트로 합쳐진 폴리지 처리도 여전히 가능합니다. 폴리지 유형 애셋은 스태틱 메시 에디터 빌드 세팅 옵션 중 Two-Sided Distance Field Generation (양면 디스턴스 필드 생성) 옵션을 켜는 것으로 최적의 결과를 낼 수 있습니다. 계산된 오클루전 결과를 부드럽게 만들어 줍니다.

스카이 라이트 옵션 중 Min Occlusion (최소 오클루전) 값을 높이면 애셋의 내부 부분이 완전히 까매지는 것을 방지할 수 있습니다.

BuildSettings_TwoSided.png

DFAO 옵션을 켜고 양면 디스턴스 필드 생성 옵션을 사용한 예제입니다:

Screen Space Ambient Occlusion only

Distance Field Ambient Occlusion on foliage

LOD (레벨 오브 디테일)을 사용하는 폴리지 애셋의 경우, DFAO 의 오클루전이 과해지는 문제가 생길 수 있습니다. 메시 디스턴스 필드 가 원거리에서 정확도가 유지되는데, LOD 레벨은 트라이앵글 수가 적은 것을 사용하고 생성된 메시 디스턴스 필드 범위 내로 수축될 수가 있기에 발생하는 문제입니다.

이 문제 해결을 위해서는, 그 LOD 에 World Position Offset 을 사용하여 버텍스를 디스턴스 필드 밖으로 끌어내면 됩니다. 보통은 카메라쪽으로 오프셋을 약간만 주면 부작용이 해결됩니다. 빌보드의 경우 Pixel Depth Offset 기능을 사용하여 원본 3D 트라이앵글 메시를 더욱 잘 표현하는 유효 깊이 값을 내주면 됩니다. 이 기법은 "소년과 연" GDC 데모의 가시거리가 긴 디스턴스 필드에 사용했습니다.

No Pixel Depth Offset

Pixel Depth Offset

원거리 트리 빌보드에 과한 오클루전이 보이고 있습니다. Pixel Depth Offset 과 Skylight Min Occlusion 를 사용하여 과한 오클루전을 덜어냅니다.

랜드스케이프

랜드스케이프는 메시 디스턴스 필드가 아닌 하이트 필드를 사용하여 표현됩니다. 여기에는 추정 원뿔 교차 방식을 사용하는데, 이에 대한 계산은 하이트 필드에 대해 이루어져 디스턴스 필드 표현이 없는 픽셀이 오클루전을 받도록 하고 있습니다. 하지만, 셀프 섀도잉이나 디스턴스 필드 섀도잉이 없습니다. 대신 랜드스케이프는 원거리 그림자에 캐스케이드 섀도우 맵(CSM)과 함께 Far Shadows 를 사용합니다.

Landscape.png

랜드스케이프 오클루전을 보여주는 DFAO 비각화 뷰 모드입니다.

퍼포먼스

DFAO 의 비용은 주로 GPU 시간과 비디오 메모리입니다. DFAO 는 중간 사양 PC, PlayStation 4, Xbox One 에서 실행 가능하도록 최적화되어 있습니다. 현재 비용이 훨씬 많이 안정화되어 (오브젝트 밀도에 따라 아주 약간 달라지긴 하지만) 거의 고정적인 비용을 보이고 있습니다.

스태틱 카메라에 거의 평평한 표면의 경우, DFAO 는 기존 구현에 비해 1.6 배 빨라졌습니다. 폴리지가 있고 카메라가 빨리 움직이는 복잡한 씬의 경우, 최신 최적화를 통해 5.5 배 빨라졌습니다. PlayStation 4 에서 전체 게임 씬의 DFAO 비용은 약 3.7ms 입니다.

최적화

DFAO 의 속도, 효율, 모양 개선을 위한 최적화 몇 가지는 다음과 같습니다.

일반 개선사항

언리얼 엔진 4.16 부로 PlayStation 4 에서 테스트한 결과 DFAO 의 개선사항은 다음과 같습니다:

최적화

원래 비용 (ms)

새로운 비용 (ms)

절약 (ms)

원래 반대로 하던 것을, 각 오브젝트에 대해 교차 화면 타일 목록을 생성하도록 컬링 알고리즘을 변경했습니다. 각 타일/오브젝트 교차마다 원뿔 트레이싱 스레드 그룹을 구하여, 각 파면이 훨씬 작아지고 스케쥴 방식도 개선되었습니다.

3.63

3.48

0.15

내부 루프의 느린 인스트럭션을 빠른 추정법으로 대체했습니다.

3.25

3.09

0.16

트랜스폼을 내부 루프에서 꺼내어 월드에서 로컬 스페이스로 이동시켰습니다 (샘플 위치는 로컬 스페이스 위치 + 방향으로 구성했습니다).

3.09

3.04

0.05

ClearUAV 에 컴퓨트 셰이더를 사용했습니다.

3.04

2.62

0.42

스무드 샘플링

DFAO 에 스무드 샘플링을 사용하기 전에는 적응형(adaptive) 샘플링을 사용했습니다. 평평한 표면은 폴리지처럼 다수의 표면으로 된 빽빽한 씬과 비교할 때 작업량이 적을 수는 있어도, 깨끗한 환경에서는 얼룩이 많이 생길 수도 있다는 뜻이기도 했습니다.

스무드 샘플링은 더욱 긴 히스토리 필터를 요하며, 이는 "고스트" (움직이는 오브젝트에 자취가 남는) 현상이 생길 수 있었습니다. 그림자를 드리우는 것이 움직일 때는 특히나 그렇습니다. 언리얼 엔진 4.16 이상에서는, 디스턴스 필드 임시 필터에 신뢰도 값을 저장하도록 하여 고스트 현상을 개선시켰습니다. 이를 통해 업샘플 도중 오클루전 누수를 트래킹한 뒤, 히스토리를 통해 그 누수된 값을 보다 빠르게 비워냅니다. 전반적으로, 카메라 또는 다이내믹 오브젝트가 빠르게 움직일 때 발생할 수 있는 고스트 현상이 줄어들 것입니다.

아래 예제에서, 적응형 샘플링을 제거해도 될 정도로 AO 계산이 빨라져, 오클루전이 훨씬 부드러워졌습니다.

적응형 샘플링

스무드 샘플링

적응형 샘플링

스무드 샘플링

글로벌 디스턴스 필드

글로벌 디스턴스 필드는 레벨에서 카메라를 따라다니는 도중 부호화 디스턴스 필드 오클루전을 사용하는 저해상도 디스턴스 필드입니다. 오브젝트 단위로 메시 디스턴스 필드 캐시를 생성하여 카메라를 중심으로 한 소수의 볼륨 텍스처에 합성해 넣습니다. 이를 클립맵이라 합니다. 새롭게 보이는 영역 또는 씬 변경에 영향받은 부분만 업데이트가 필요하므로, 합성 비용은 많이 들지 않습니다.

카메라 주변 클립맵을 네 개의 슬라이스로 나누어 필요할 때만 업데이트합니다. 그러한 상황은 카메라 이동으로 새로운 슬라이스가 드러날 때만 발생하며, 오브젝트가 이동하지 않아 영향력 경계가 더티 상태가 되는 경우는 발생하지 않습니다. 클립맵 유지 평균 비용은 거의 0 에 가깝지만, 최악의 경우 텔레포트같은 것을 할 때는 업데이트 비용이 더욱 높아질 수도 있습니다.

DF_ClipMap.png

클립맵 텍셀 크기 시각화로, 각 클립맵을 각기 다른 색으로 나타낸 것입니다.

오브젝트 디스턴스 필드의 저해상도라는 것은 모든 것에 사용할 수는 있지만, 스카이 오클루전에 대한 원뿔 트레이스를 계산할 때는 셰이딩이 일어나는 지점 근처에서 샘플링을 하는 반면 글로벌 디스턴스 필드는 샘플링을 더욱 멀리서 합니다.

글로벌 디스턴스 필드는 그에 해당하는 오브젝트 디스턴스 필드 부분보다 저해상도라, 근처 표면의 글로벌 디스턴스 필드 정확도가 떨어집니다. 콘 트레이스가 발생하면, 오클루전 콘 시작 부분 근처에는 오브젝트 디스턴스 필드를 사용하고 트레이스 나머지에는 글로벌 디스턴스 필드를 사용하여, 정확한 셀프 오클루전과 효율적인 원거리 트레이스를 둘 다 취하는 더 나은 결과를 얻을 수 있습니다. 그 덕에 스카이 오클루전의 경우 실제 최대 오브젝트 영향력 거리가 크게 감소하여 퍼포먼스가 다섯 배 정도 향상되었습니다.

한계

기술적 한계

  • 앰비언트 오클루전만 제공되며, 블로킹 거리가 제한된 스카이 오클루전과는 다릅니다.

  • 스태틱(rigid) 메시에서만 그림자를 드리웁니다. 스켈레탈 메시의 경우 간접광 영역에는 캡슐 섀도우 를 사용하세요.

현재 구현상 한계 (추후 개선 가능)

  • 동적인 씬 변화의 AO 업데이트가 약간 지연되는데, 작업이 여러 프레임에 걸쳐 일어나기 때문입니다. 샘플을 새로 생성하면서 오클루전이 약간 어긋날 수 있습니다. 이 부분은 4.16 이후 디스턴스 필드 임시 필터에 신뢰도 값을 저장하게 한 뒤 업샘플 도중 오클루전 누수를 트래킹하고 그 후 히스토리를 통해 누수된 값을 빠르게 비우도록 하는 방식으로 개선되었습니다. 카메라가 움직일 때 발생할 수 있는 고스트 현상을 줄이는 데 도움이 됩니다.

  • 각 메시마다 하나의 볼륨 텍스처가 매핑되므로, 커다란 오브젝트에는 디스턴스 필드 해상도가 조악하여 AO 퀄리티가 떨어질 것입니다.

디스턴스 필드 한계 관련 추가 정보는, 메시 디스턴스 필드 문서를 참고하세요.

저렴한 바운스 라이팅

스카이 라이트의 Lower Hemisphere is Solid Color (하반구는 단색) 옵션 체크를 해제하고 큐브맵에 바닥 색을 약간 칠해주는 것으로, 추가 비용 없이 태양빛이 반사되는 효과를 얻을 수 있습니다. 이는 디렉셔널 라이트의 섀도잉을 따르지 않기에 실내에서 빛샘 현상이 있을 수 있지만, 야외 씬에서는 효과적일 수 있습니다.

언리얼 엔진 문서의 미래를 함께 만들어주세요! 더 나은 서비스를 제공할 수 있도록 문서 사용에 대한 피드백을 주세요.
설문조사에 참여해 주세요
취소