비저빌리티 및 오클루전 컬링

언리얼 엔진 4 레퍼런스 및 안내서입니다.

Windows
MacOS
Linux

언리얼 엔진 4 (UE4) 는 비저빌리티(가시성) 및 오클루전 컬링을 위한 메서드를 제공합니다. 이 컬링 메서드는 게임 퍼포먼스 최적화에 좋습니다. 각 메서드 작동 방식은 레벨의 액터에 대해 화면에 그릴지 말지를 설정하는 식으로 그릴 액터 수를 줄입니다. 이 메서드 중 일부는 (예: 뷰 프러스텀하드웨어 오클루전 쿼리) 동시에 같이 사용할 수도, 특정 디바이스 및 플랫폼에 더욱 적합할 수도 있습니다 (예: 가상 현실에는 라운드 로빈 오클루전).

컬링 작동 방식

별도의 구성 없이 언리얼 엔진에 기본 제공되는 기능을 확인하기 위해, 구체적으로 뷰 프러스텀 컬링과 하드웨어 오클루전 쿼리를 살펴보겠습니다.

비저빌리티 및 오 클루전 컬링 메서드에 대한 일반적인 개념은 일정 시간에 보이는 오브젝트 수를 줄여 퍼포먼스를 향상시키는 것입니다.

예를 들어 카메라 위치에서 보이는 것으로만 시작해 보면, 보이는 오브젝트가 몇 개 없습니다 (왼쪽). 하지만 씬을 이루는 오브젝트 중 다수가 이 위치에서 보이지 않기 때문에 반드시 그렇다고는 볼 수 없습니다 (오른쪽).

씬 뷰

씬의 탑 뷰

카메라의 시야(뷰 프러스텀) 바깥 오브젝트는 보이지 않으며, 컬링 가능합니다 (빨강 윤곽선 오브젝트).

씬 뷰

씬 뷰에서 | 뷰 프러스텀 컬링 오브젝트를 제거

카메라 뷰 프러스텀 바깥의 컬링된 오브젝트는 더이상 렌더링되지 않으며, 이 뷰 안에는 다른 오브젝트에 가려져 가시성 검사를 해야 할 오브젝트가 얼마 안남았습니다. 즉 이 패스 도중, GPU 에 쿼리를 전송하여 이 오브젝트의 가시성 상태 각각을 테스트합니다. 다른 오브젝트에 가려져 컬링되는 오브젝트는 뷰에서 컬링됩니다 (파랑 윤곽선 오브젝트).

씬 뷰 | 뷰 프러스텀의 오브젝트만

뷰 프러스텀 컬링 안에서 | 가려진 오브젝트

뷰 프러스텀 바깥에 있거나 가려진 오브젝트는 전부 이제 뷰에서 컬링합니다. 이제 최종 씬 뷰가 카메라 위치에서 씬에 보이는 것으로 알고있는 오브젝트와 일치합니다.

Vis_FinalSceneView.png

언리얼 엔진 4 는 여러가지 컬링 메서드를 제공하며, 각각 저마다의 장단점이 있으며 플랫폼마다 사용할 수 있는 것이 다릅니다.

추가 정보는 아래 컬링 메서드 섹션을 참고하세요.

액터의 바운드로 가시성 테스트

레벨의 배치된 각 액터에는 박스와 구체를 사용한 바운드 세트가 있으며, 이는 엔진 여러 곳에 사용됩니다. 그 중 하나는 구체적으로 보이는지 여부를 테스트하는 것입니다. 액터의 바운드는 두 부분으로 이루어지는데, 구체와 박스입니다. 바운딩 구체는 간단한 거리 테스트로 빠른 콜리전 감지에 사용되며, 대개 포함된 오브젝트보다 크기가 큽니다. 반면 바운딩 박스는 오브젝트 모양에 더 가깝고 더 정확한 결과를 냅니다.

레벨 뷰포트에서 액터의 바운드 시각화는 표시 > 고급 > 바운드 를 선택하면 됩니다. 또는 스켈레탈 메시 에디터에서 캐릭터 > 바운드, 스태틱 메시 에디터에서 메인 툴바의 바운드 를 선택하면 됩니다.

ActorBounds.png

액터에 (구체와 박스) 바운드를 표시한 모습입니다.

스태틱 메시와 스켈레탈 메시 각각은 임포트할 때나 뷰포트에서 회전 또는 스케일 조절할 때 지오메트리 크기에 따라 스케일이 자동 설정되는 자체 바운등 박스와 구체가 있습니다.

액터의 바운드를 편집하는 방법은 다음과 같습니다.

  • 레벨이나 블루프린트에 선택하고 디테일 패널에서 Bounds Scale (바운드 스케일)을 설정합니다. Bounds Scale 은 액터의 바운드에 균등 스케일 조절하여, 원래 스케일 값의 배수 역할을 합니다.

    이미지를 클릭하면 원본을 확인합니다.

  • 스태틱 메시 또는 스켈레탈 메시 에디터를 열어 디테일 패널의 Positive Bounds Extension (양수 바운드 확장) 및 Negative Bounds Extensions (음수 바운드 확장)에 비균등 스케일을 적용합니다. ActorEditorBoundsExtension.png

액터의 바운드를 늘리면 액터의 컬링 시점이 늦춰져 퍼포먼스와 섀도 퀄리티에 영향을 줄 있습니다.

컬링 메서드

레벨의 각 액터 가시성 상태 추적에 사용되는 컬링 메서드입니다. 씬의 데이터는 프로젝트에 활용되고 있는 메서드에 따라 테스트와 컬링이 이루어집니다.

다음 컬링 메서드는 비용에 따라 이 순서대로 적용됩니다.

언리얼 엔진은 모든 프로젝트에 기본적으로 뷰 프러스텀 컬링과 하드웨어 오클루전 쿼리 (다이내믹 오클루전)을 사용합니다. 프로젝트에 액터 수가 많으면 GPU 퍼포먼스 비용이 생길 수 있는데, 씬 뷰에 보이는 액터 수가 많을 경우 특히 그렇습니다.

디스턴스

디스턴스 컬링 메서드는, 액터 별 세팅과 컬 디스턴스 볼륨 처럼, 액터와 카메라의 거리에 따라 액터를 렌더링하거나 하지 않습니다.

액터별 인스턴스

레벨의 각 액터에는 디테일 패널에서 설정할 수 있는 자체 그리기 거리 세팅이 있습니다. 거기서 이 액터를 그릴 카메라와의 최소 최대 거리를 (언리얼 유닛 단위로) 설정할 수 있습니다.

PerActorDistanceCullingSettings.png

액터의 그리기 거리 세팅은 다음과 같이 설정합니다.

  • Minimum Draw Distance (최소 그리기 거리)는 액터와 카메라가 이 거리부터 보입니다. 액터가 이보다 가까이 있으면 더이상 렌더링하지 않습니다.

  • Maximum Draw Distance (최대 그리기 거리)는 액터와 카메라가 이 거리까지 보입니다. 액터가 이보다 멀리 있으면 더이상 렌더링하지 않습니다.

  • 그리고 Current Maximum Draw Distance (현재 최대 그리기 거리)를 볼 수 있습니다 (편집은 안됩니다). 컬 디스턴스 볼륨 이 존재하면, 거기 설정된 컬 디스턴스를 표시합니다.

컬 디스턴스 볼륨

Cull Distance Volume (컬 디스턴스 볼륨)은 거리와 크기 배열을 사용하여 볼륨 내 액터의 렌더링 여부를 설정합니다. 이 컬링 메서드가 좋은 경우는 대규모 야외 레벨에서 건물이나 구조물에 세밀한 실내 장식이 많은데, 원거리에서 중요성이 떨어지는 너무 작은 오브젝트를 컬링하고 싶은 경우입니다.

자세한 정보는 컬 디스턴스 볼륨 문서를 참고하세요.

뷰 프러스텀

View Frustum (뷰 프러스텀) 컬링은 카메라 시야(FOV)의 가시 화면 영역을 사용하여 이 공간 안에 없는 오브젝트를 컬링하는 것입니다. 뷰 프러스텀은 근거리/원거리 클립 면 사이 피라미드 모양으로, 이 공간 안에 표시할 오브젝트의 최소 최대 거리를 정의합니다. 다른 모든 오브젝트는 제거하여 처리 시간을 절약합니다.

ViewFrustumDiagram.png

  1. Near Clipping Plane (근거리 클립 면)은 오브젝트가 표시되는 카메라와의 최소 거리입니다.

  2. Camera Frustum (카메라 프러스텀)은 근거리/원거리 클립 면 사이 가시 영역을 나타내는 피라미드 모양입니다.

  3. Far Clipping Plane (원거리 클립 면)은 오브젝트가 표시되는 카메라와의 최대 거리입니다.

레벨 뷰포트에서 편집하는 도중 뷰 프러스텀 시각화는 표시 > 고급 에서 카메라 프러스텀 옵션을 켜면 됩니다.

ViewFrustumSceneCameraFrustum.png

카메라 프러스텀 시각화가 활성화된 모습입니다.

자세한 정보는 컬링 작동 방식 섹션을 참고하세요.

프리컴퓨티드 비저빌리티

Precomputed Visibility Volume (프리컴퓨티드 비저빌리티 볼륨)은 그림자를 드리우는 표면 위에 배치된 셀에서 무버블이 아닌 액터의 가시성 상태를 저장합니다. 이 컬링 메서드는 가시성 데이터를 오프라인 (라이팅 빌드 도중) 생성하며 중소규모 레벨에 가장 적합합니다. 프리컴퓨티드 비저빌리티는 저사양 하드웨어와 모바일 디바이스에 이상적입니다. 이 하드웨어 및 디바이스에서 퍼포먼스 비용을 고려할 때, 더 비싼 렌더링 스레드 비용을 퍼포먼스 측면에서 더 유연한 런타임 메모리 비용과 맞바꾸면 최대의 효과를 얻을 수 있습니다.

추가 정보는 프리컴퓨티드 비저빌리티 볼륨 문서를 참고하세요.

다이내믹 오클루전

UE4 의 다이내믹 오클루전 시스템는 몇 가지 컬링 메서드 중에서 선택할 수 있습니다. 이 메서드 각각은 다른 액터에 가려진 카메라의 뷰 프러스텀 (또는 시야) 내 레벨의 액터 가시성 상태를 추적합니다. GPU 또는 CPU 에 쿼리를 보내 각 액터의 가시성 상태를 검사합니다. 휴리스틱을 통해 필요한 가시성 검사 횟수를 줄이면, 전반적인 컬링 효율과 퍼포먼스가 향상됩니다.

언리얼 엔진은 오클루전 쿼리를 보낼 때 씬 뎁스 버퍼를 사용합니다. 최대 그리기 거리(나 원거리 클립 면) 보다는 대략적인 거리에 의존하므로 더욱 먼 거리에 사용할 수 있습니다. 뎁스 버퍼를 사용하면 무버블인 액터도 아닌 액터도 다른 액터를 가리거나 가려지도록 할 수 있으며, 그 머티리얼이 오파크 또는 마스크드 블렌드 모드인 것도 포함합니다.

하드웨어 오클루전 쿼리

활용되는 일차 다이내믹 오클루전 메서드는 Hardware Occlusion Queries (하드웨어 오클루전 쿼리)로, 매 프레임 GPU 에 가시성 검사를 액터 별 쿼리로 보냅니다. 액터의 가시성은 한 프레임 뒤에 읽어 오므로, 카메라가 매우 빨리 움직이는 경우 "튀는" 현상이 생길 수 있습니다. 하드웨어 오클루전 쿼리 비용은 GPU 에서 수행되는 쿼리 수에 비례합니다. 디스턴스 및 프리컴퓨티드 비저빌리티를 사용하면 GPU 에 매 프레임 수행되는 쿼리 수를 줄일 수 있습니다.

하드웨어 오클루전 쿼리는 기본 활성화되며, iOS 에서는 ES 3.1 이상, Android 에서는 Vulkan 을 지원하는 고사양 모바일 디바이스 포함 지원하는 모든 플랫폼에서 작동합니다. 하드웨어 오클루전 쿼리를 지원하지 않는 디바이스는 프로젝트 세팅 에서 렌더링 > Culling 아래 Occlusion Culling 체크를 해제하거나 디바이스 환경설정 파일에 다음 콘솔 변수를 설정하면 됩니다.

  r.AllowOcclusionQueries=0

다이내믹 오클루전의 비용 관련 추가 정보는 아래 퍼포먼스 통계 부분을 참고하세요.

하이어라키컬 Z 버퍼 오클루전

Hierarchical Z-Buffer (하이어라키컬 Z 버퍼, HZB) 오클루전은 하드웨어 오클루전 쿼리처럼 작동하지만, 오브젝트 컬링 방식이 보수적이라 컬링되는 오브젝트 수가 적다는 차이가 있습니다. 씬 뎁스 렌더 타깃의 밉맵 버전을 사용하여 액터의 바운드 검사를 합니다. 낮은 MIP 에서 샘플링할 때는 필요한 텍스처 페치 수가 적기도 합니다.

HZB 오클루전을 기본 활성화하는 명령은 다음과 같습니다.

  r.HZBOcclusion=1

모바일용 소프트웨어 오클루전 쿼리

Software Occlusion Queries (소프트웨어 오클루전 쿼리)는 액터에 지정된 레벨 오브 디테일(LOD)을 사용하여 그 뒤의 액터를 가리는 오클루전 메서드입니다. 이 컬링 메서드는 CPU 에서 씬을 래스터라이즈하여 액터를 컬링하는데, 하드웨어 오클루전 쿼리가 GPU 에서 가시성 검사를 하는 것과 대조됩니다. 오프트웨어 오클루전은 보수적으로 설계되어 있어 모든 모바일 디바이스에서 활성화하여 사용할 수 있습니다.

추가 정보는 모바일용 소프트웨어 오클루전 쿼리 문서를 참고하세요.

VR 용 라운드 로빈 오클루전

Round Robin Occlusion (라운드 로빈 오클루전)은 다이내믹 오클루전 쿼리 메서드 중 하나로, 양쪽 프레임 둘 다가 아닌 한 쪽 눈에 한 프레임씩 번갈아 렌더링하여 스테레오 렌더링 퍼포먼스를 향상시킵니다. 오클루전 데이터에 프레임 지연시간이 추가되므로 주변 장치의 렌더링이 잘못될 수 있다는 단점이 있지만, 그만큼 라운드 로빈 오클루전이 전체 프레임의 쿼리 시간을 절약한다는 장점이 있습니다. 이렇게 절약되는 부분은 드로 콜이나 가시성 제약을 받는 씬에 큰 도움이 될 수 있습니다.

.ini 환경설정 파일이나 런타임에 라운드 로빈 오클루전을 활성화하는 명령은 다음과 같습니다.

 vr.RoundRobinOcclusion=1

퍼포먼스 통계

게임 규모에 상관 없이 개발 패스 중 가장 중요한 부분 중 하나라면 퍼포먼스 최적화입니다. 거기에 씬의 오브젝트 컬링은 아주 좋은 방법입니다. 통계 창에서는 비저빌리티 및 오클루전 컬링의 퍼포먼스가 반영된 다양한 통계를 살펴볼 수 있습니다.

예를 들어 프리컴퓨티드 비저빌리티의 경우, 컬링된 오브젝트 데이터를 로드하느라 런타임에 사용되는 메모리 양을 눈여겨 봐야 할 것입니다. 하드웨어 오클루전 쿼리의 경우, 멈춤 현상이나 느려짐 현상같은 퍼포먼스 문제가 발생하는 시점의 프레임 동안 GPU 에 전송되는 프리미티브 수를 검사하는 것이 좋습니다.

통계 창을 부르는 콘솔 명령은 stat initviews 입니다.

StatInitViews.png

위의 씬 통계는 에픽게임즈 마켓플레이스 에서 무료로 받을 수 있는 에픽게임즈 제작 Infinity Blade Grasslands 에서 따온 것입니다.

이 통계는 Cycle Counters (사이클 카운터)와 Counters (카운터) 두 섹션으로 나뉩니다. Cycle Counter 통계는 프리미티브 처리에 걸린 렌더링 사이클 수의 밀리초 (ms) 비용에 초점을 맞춥니다. 여기서 View Visibility, Occlusion Cull, View Relevance, Frustum Cull 에 초점을 맞춥니다. Counter 통계는 현재 뷰의 모든 프리미티브를 처리하는 데 걸린 시간을 더합니다.

비저빌리티 테스팅 및 오클루전 컬링에 유의해야 하는 사항은 다음과 같습니다.

  • 오클루전 컬링은 와이어프레임 뷰 모드에서 비활성화됩니다.

  • 뷰포트에서 작업할 때 G 단축키로 게임모드 뷰로 전환하면 컬 디스턴스 볼륨이나 프리컴퓨티드 비저빌리티 볼륨같은 일부 컬링 메서드를 확인할 수 있습니다.

  • 가장 정확한 결과를 위해서는, 에디터에서 플레이 (PIE) 또는 독립형 게임 에서 Stat InitViews 통계를 사용하세요. 라이트, 카메라 등을 나타내는 액터의 지오메트리가 비저빌리티 및 오클루전 컬링 결과 계산에 포함됩니다.

  • Visible Static Mesh Elements (보이는 스태틱 메시 엘리먼트 수)는 렌더링 스레드에 가장 큰 영향을 미치는 요소이므로 주의깊게 관찰하고 최적화해야 합니다.

통계 이름

설명

Cycle Counters 사이클 카운터

View Visibility

뷰 비저빌리티 - 액터 비저빌리티 쿼리를 처리하는 데 걸린 프레임 시간입니다.

Occlusion Cull

오클루전 컬 - 뷰 프러스텀 안에 있는 액터 중 다른 액터에 가려진 액터에 대해 씬 쿼리를 하는 데 걸린 프레임 시간입니다.

Frustum Cull

프러스텀 컬 - 액터의 바운드가 뷰 프러스텀 안에 있는지 쿼리하는 데 걸린 프레임 시간입니다.

Decompress Occlusion

오클루전 압축해제 - 프리컴퓨티드 비저빌리티를 로드하는 데 걸린 프레임 시간입니다.

Counters 카운터

Processed Primitives

처리한 프리미티브 - 씬에서 처리 중인 액터의 총 수입니다.

Frustum Culled Primitives

프러스텀 컬링한 프리미티브 - 뷰 프러스텀의 FOV 안에 있지 않을 때 컬링한 프리미티브 수입니다.

Occluded Primitives

가려진 프리미티브 - 뷰 프러스텀의 FOV 안에서 다른 액터에 가려진 액터의 수입니다.

Occlusion Queries

오클루전 쿼리 - 뷰 프러스텀 내 보이는 액터의 수에 따라 GPU 에 전송한 씬 오클루전 쿼리 수입니다.

Visible Dynamic Primitives

보이는 다이내믹 프리미티브 - 씬의 다이내믹 프리미티브 중 모빌리티가 무버블로 설정된 것의 개수로, 파티클 시스템 및 폴리지 인스턴스 등입니다.

Visible Static Mesh Elements

보이는 스태틱 메시 엘리먼트 수 - 보이는 메시 중 씬에서 모빌리티가 스태틱 설정된 개수입니다.

컬링 디버깅

비저빌리티 및 오클루전 컬링에 사용할 수 있는 디버깅 옵션은 다음과 같습니다.

가려진 액터 시각화

에디터에서 작업할 때 액터가 가려졌는지 확인할 수 있는 시각화 명령입니다.

 r.VisualizeOccludedPrimitives 1

활성화하면, 가려진 액터 주위에 녹색 바운딩 박스가 그려집니다.

레벨에 액터가 많은 경우, 레벨과 그 안에 들어있는 액터의 일정 부분을 숨기지 않으면 유용한 디버깅 방법이 되지 못할 수 있습니다.

가려진 액터 시각화

지오메트리를 숨기고 | 가려진 액터 표시

이 예제에서는, 벽과 문 뒤의 액터만 완전히 가려졌습니다. 오른쪽 벽 구멍을 통해 보이는 액터는 완전히 가려지지 않았습니다.

씬의 렌더링 프리즈

에디터에서 작업하는 도중 레벨의 액터 렌더링 상태를 "프리즈"(freeze), 얼리고서 레벨 뷰포트 안에서 자유로이 움직이며 오클루전 결과를 조사할 수 있습니다.

다음 예제와 같이 원하는 뷰에서 FreezeRendering 명령을 입력합니다.

FreezeRendering.png

입력한 뒤, 씬을 자유롭게 이동하며 오클루전 결과를 확인할 수 있습니다. 벽 뒤로 이동해 보면, 완전히 가려진 오브젝트는 렌더링되지 않고, 완전히 가려지지 않은 오브젝트는 그대로 있습니다.

보통 씬 뷰

렌더링을 얼린 | 원본 카메라 뷰

다른 액터 유형의 렌더링 상태를 프리즈하는 명령은 다음과 같습니다.

콘솔 명령

설명

FreezeRendering

카메라 시야에 따라 레벨에 가려지고 보이는 액터의 현재 렌더링 상태를 일시정지 / 해제합니다.

Foliage.Freeze

카메라 시야에 따라 레벨에 페인트된 폴리지 클러스터의 가려지고 보이는 현재 렌더링 상태를 일시정지합니다.

Foliage.Unfreeze

레벨에 칠해진 폴리지 클러스터의 가려지고 보이는 렌더링 상태의 일시정지를 해제합니다.

FX.FreezeParticleSimulation

레벨의 CPU 스프라이트 파티클 시뮬레이션을 일시정지 / 해제합니다.

FX.FreezeGPUSimulation

레벨의 GPU 스프라이트 파티클 시뮬레이션을 일시정지 / 해제합니다.

게임 뷰 모드 사용

게임 뷰 모드를 사용하면 에디터에서 작업 도중 게임이 어때 보일지 파악할 수 있습니다. 이 뷰 모드를 사용하면 에디터에서 플레이(PIE) 모드나 독립형 게임 모드에서 보이는 대로 게임을 시각화해 보여주지만, 계속해서 월드를 돌아다니며 오브젝트를 편집할 수 있습니다.

게임 뷰 활성화는 키보드의 G 단축키 또는 에디터에서 작업할 때 뷰포트 드롭다운 메뉴에서 게임 뷰 를 선택하면 됩니다.

에디터 뷰

게임 뷰

게임 뷰 를 활성화하면, (게임에 있는 것처럼) 라이트나 파티클 시스템과 같은 액터의 아이콘이 숨겨집니다. 컬 디스턴스 볼륨 또는 프리컴퓨티드 비저빌리티 볼륨을 사용하(고 셀에 있)는 경우, 컬링 적극성에 따라 그 볼륨의 컬링 결과를 즉시 확인할 수 있습니다.

새로운 언리얼 엔진 4 문서 사이트에 오신 것을 환영합니다!

문서 사이트에 대한 의견을 모을 수 있는 피드백 시스템을 포함해서 여러가지 새로운 기능을 준비하고 있습니다. 아래 Documentation Feedback 포럼(영문) 또는 언리얼 엔진 네이버 공식 카페(한글) 중 편하신 곳에 의견이나 문제점을 알려 주세요.

새 시스템이 준비되면 알려 드리겠습니다.

네이버 카페
공식 포럼