UDN
Search public documentation:

VisibilityCullingKR
English Translation
日本語訳
中国翻译

Interested in the Unreal Engine?
Visit the Unreal Technology site.

Looking for jobs and company info?
Check out the Epic games site.

Questions about support via UDN?
Contact the UDN Staff

UE3 홈 > 렌더링 > 표시여부 컬링 (Visibility Culling)

표시여부 컬링 (Visibility Culling)


문서 변경내역: Ryan Brucks, Daniel Wright 작성. 홍성진 번역.

개요


언리얼 엔진 3은 최적의 성능을 위해 다음과 같은 여러가지 culling(생략, 컬링) 방법을 동시에 적용합니다:

  • Distance culling (거리 컬링)
  • View frustum culling (뷰 절두체 컬링)
  • Precomputed occlusion culling (미리계산된 오클루전 컬링)
  • Dynamic occlusion culling (hardware occlusion queries) (동적인 오클루전 컬링 (하드웨어 오클루전 퀴리))

컬링 성능


stat initviews 명령으로 컬링 통계가 다음과 같이 표시됩니다:

StatInitviews.jpg

'Visible static mesh elements'(보이는 스태틱 메시 엘리먼트)가 렌더링 쓰레드 시간에 가장 큰 영향을 끼치는 것이니, 최적화 요주의 대상입니다.

각 프리미티브에 적용된 컬링 방법을 순서대로 나열해 보면 이와 같으며, 렌더링 쓰레드 비용이 가장 싼 것에서부터 가장 비싼 순이기도 합니다.

  • 거리 컬링
  • 뷰 절두체 컬링
  • 미리계산된 오클루전 컬링
  • 동적인 오클루전 컬링 (하드웨어 오클루전 퀴리)

오클루전 컬링 방법은 거리 컬링 방법보다 훨씬 비싸기에, 거리가 먼 경우 맵의 일정 부분만 가려지더라도 cull distance volume(컬 디스턴스 볼륨)으로 설정해 주는게 좋습니다. 물론 스트리밍에서 완전히 빼버리는 것이 훨씬 낫긴 합니다.

거리 컬링


뷰에서 프리미티브 컴포넌트는 자신의 MaxDrawDistance (그리기 최대 거리)보다 멀거나 MinDrawDistance (그리기 최소 거리)보다 가까우면 거리 컬링(생략)됩니다.

컬 디스턴스 볼륨

cull distance volume(컬 디스턴스 볼륨)은 최적화에 매우 좋은 도구입니다. 그 안의 모든 프리미티브에 컬 거리를 자동으로 설정해 주는 볼륨으로, 개별 프리미티브의 경계를 기반으로 합니다. 컬 디스턴스 볼륨 값은 프리미티브에 설정된 MaxDrawDistance (그리기 최대 거리)보다 낮을 때만 사용됩니다. 이는 언리얼 토너먼트 3 에서 흔히 볼 수 있듯이, 디테일한 실내를 기반으로 한 커다란 야외 맵을 최적화하기 위한 용도로 구현된 것입니다.

컬 디스턴스 볼륨을 매우 정교하게 체계적으로, 즉 다양한 지역을 각기 다르게 설정할 수는 있겠지만, 99%의 경우는 그냥 컬 디스턴스 볼륨 하나로 레벨 전체를 둘러버리는 것으로 시작하는 것이 좋습니다.

관련 설정

ActorProperties.JPG

다음 속성은 프리미티브가 가려지거나(occluded) 다른 프리미티브를 가리는(occlude) 방법에 영향을 끼칩니다:

bAllowCullDistanceVolumes (컬 디스턴스 볼륨 허용?)
기본값은 참입니다. 참이면 해당 프리미티브는 컬 디스턴스 볼륨에 영향을 받습니다 (아래 참고). 컬 디스턴스 볼륨 정보는 CachedMaxDrawDistance (캐시된 최대 표시 거리)가 프리미티브에 설정된 그리기 최대 거리보다 낮을 때만 프리미티브의 그리기 최대 거리를 덮어쓰게 됩니다.

CachedMaxDrawDistance (캐시된 그리기 최대 거리)
편집할 수 없는 속성입니다. 이 필드에는 해당 프리미티브가 놓여 있는 컬 디스턴스 볼륨에 의해 설정된 컬 거리가 표시됩니다. 여기 속성 스크린샷에는 사용된 컬 디스턴스 볼륨이 없어서 0으로 설정되어 있습니다.

MaxDrawDistance (그리기 최대 거리)
기본값 0은 프리미티브가 거리만으로 가려지지는 않게 된다는 뜻입니다. 그리기 최대 거리 값은 언리얼 단위이므로, 원하는 값은 프로젝트의 스케일에 따라 달라집니다. 컬 거리는 일정 거리에서는 거의 보이지 않을 만큼 작아지는 세부 장식이나 울타리와 같이 매우 작거나 얇은 것에 매우 좋습니다. 카메라를 앞뒤로 움직이며 팝핑이 잘 안보이는 지점을 찾아볼 때, 컬 거리도 만져 보시기 바랍니다.

컬 디스턴스 볼륨 추가하기

addculldistancevolume.JPG

컬 디스턴스 볼륨은 다른 종류와 똑같은 식으로 추가합니다. 먼저 필요한(, 이를테면 전체 레벨을 덮는) 크기의 브러시를 만듭니다. 브러시 만드는 법에 대해서는 BSP 브러시 사용하기 페이지를 참고하십시오. 우클릭, 볼륨 추가 부분에 펼쳐지는 목록에서 CullDistanceVolume 을 선택합니다.

월드에 컬 디스턴스 볼륨을 만들었으니, 선택하고 F4키를 누르거나 더블클릭하면 액터 속성창이 뜹니다.

새로 만든 CullDistanceVolume 속성은 이와 같습니다:

culldistancevolumeproperties.JPG

"CullDistances"라는 일차 배열에다 지점을 원하는 만큼 얼마든지 추가할 수 있습니다. 각 지점에는 'Size'(크기)와 연결된 CullDistance(컬 거리)가 있습니다. 이 볼륨 안에 있는 프리미티브 전부에 대해서, 그 경계 지름과 가장 근사치 'Size'에 해당하는 "CullDistance"가 프리미티브의 "Cached Cull Distance"(캐시된 컬 거리)가 됩니다.

컬 디스턴스 볼륨에 중심점이 포함되어 있으면서 bAllowCullDistanceVolume (컬 디스턴스 볼륨 허용?)이 (기본값) 참으로 설정된 프리미티브 전부는, 사용된 컬 거리를 CullDistances 배열의 설정에 따라 업데이트하게 됩니다. 프리미티브의 컬 거리 값은 컬 디스턴스 볼륨과 결합되서 작용하고, 0이 아닌 다음에야 코드가 내부적으로 낮은 값을 선택하기에, 수동으로 설정해 봐야 의미가 없습니다. CullDistances (컬 거리) 배열은 이 크기 그룹에 사용할 컬 거리와 크기(오브젝트의 경계 구체 지름) 대조표이며, 코드가 가장 가까운 것을 찾아 지정된 컬 거리를 할당해 줍니다.

컬 디스턴스 볼륨용 기본 설정에는 항목이 둘 있습니다. Size=0, CullDistance=0 과 Size=10000, CullDistance=0 입니다. 첫 CullDistance 설정 1000에 의해, 경계 구체 지름이 5000 미만이면서 볼륨 안에 중심점이 있는 오브젝트 전부는 유효 컬 거리값 1000을 갖게 되며, 그 이상의 컬 거리값은 0, 즉 거리 컬링이 없는 겁니다. 배열 항목 순서에 관계 없이 데이터 최소량 항목 허용을 위해 최적 접근법을 선택하여 사용하고 있습니다. 컬링을 끌 때 작은 오브젝트에 대한 컬 거리에 영향을 끼치지도 않고, 높은 쪽에다가 더미 포인트를 삽입하지 않아도 되게 하기 위해, 코드는 컬 거리간에 선형 보간을 하지 않습니다.

컬 디스턴스 볼륨이 겹치는 경우, 엔진은 프리미티브에 대한 가장 적극적(0보단 크면서 가장 작은) 설정을 선택하게 됩니다.

조직화 편의를 위해서는, CullDistances 배열의 크기 전부를 가장 작은 것에서부터 오름차순으로 유지하는 게 좋습니다. 중간값을 추가할 때는 '여기에 새 아이템 추가' 버튼을 사용하십시오.

컬 디스턴스 볼륨을 새로 시작할 때, 보통 CullDistances 에다 'Size' 및 'CullDistance' 수치를 키워가며 둘 정도 추가합니다. 첫 설정 상태는 이와 같습니다:

  0:
  Size: 0
  CullDistance: 1000
  
  1:
  Size: 128
  CullDistance: 2048
  
  1:
  Size: 256
  CullDistance: 4096
  
  2:
  Size: 512
  CullDistance: 8192
  
  3:
  Size: 1024
  CullDistance: 16384
  
  4:
  Size: 2048
  CullDistance: 0
  

그리고서 레벨을 날아다니며 팝핑이 보이는지 (혹은 초기 설정이 그다지 적극적이지 않지는 않은지)를 알아봅니다. 그리고서 약간씩 변화를 주거나 기존 크기 그룹에다가 새로 몇 개 추가해 봅니다. 여러 프리미티브의 'Cached Cull Distance'(캐시된 컬 거리)를 보면 어느 크기 범주에 떨어지는 지 알아보는데 도움이 됩니다. 에디터 뷰포트 툴바의 '플랙 표시' 내리펼침 상자에서 '경계 표시'를 선택해 볼 수도 있습니다. 그리고서 프리미티브를 선택하면 주변에 구체를 그려 경계를 나타냅니다. 구체 지름에다 가운데 버튼을 누르고 끌어 줄자를 대 보면 경계를 측정해 볼 수 있겠습니다.

컬 디스턴스 볼륨을 제대로 설정하는 데는 약간 (많은) 미세조정이 필요합니다. 목록의 마지막 아이템에다가 '컬 거리에 너무 큰' 값을 두는 것도 좋습니다. CullDistance 에는 0, Size 에는 큰 값으로요. 이를 통해 큰 산이나 건물 오브젝트가 컬링되지 않게 할 수 있습니다. 그런 프리미티브에 대해서는 그냥 bAllowCullDistanceVolumes 를 끌 수도 있겠습니다만, 작업량이 많아지게 됩니다.

미리계산된 오클루전 컬링


PrecomputedVisibilityKR 표시여부 미리계산 (Precomputed Visibility) 페이지 참고.

동적인 오클루전 컬링


동적인 오클루전 컬링 시스템은 각 프리미티브 컴포넌트에 대한 표시여부 상태를 추적하여, query(질의, 퀴리) 수는 줄이면서도 컬링 효율은 높이기 위해 heuristics(체험법) 기반으로 하드웨어 오클루전 퀴리 명령을 내립니다. 퀴리는 한 프레임 이후 GPU에서 읽기에, 코너를 돌거나 할 때 오브젝트가 보이는지 여부를 판단하는 데 있어 한 프레임 지연이 생기고, 팝핑이 생길 수 있습니다. 오클루전 퀴리는 씬의 심도 버퍼에 대해 내려지기에, 불투명 및 마스킹된 머티리얼과 마찬가지로 동적 정적 프리미티브 둘 다 가릴 수 있습니다.

오클루전 결과 테스트하기


와이어프레임에서는 오클루전이 꺼져 있기에 오브젝트가 가려졌는지를 확인할 수 없습니다. 에디터에 있는 오클루전 미리보기 기능을 통해 오클루전 작동 상황을 쉽게 파악할 수 있습니다.