다른 컬링 메서드와 마찬가지로 프리컴퓨티드 비저빌리티 볼륨(Precomputed Visibility Volume) 은 소형에서 중형 크기의 월드, 그리고 보통 하드웨어에 따라 다이내믹 오클루전 컬링이 제한된 모바일에서의 퍼포먼스 최적화에 사용됩니다. 프리컴퓨티드 비저빌리티 볼륨은 플레이어 또는 카메라 위치에 따라 월드 내 액터 위치의 비저빌리티(가시성) 상태를 저장합니다. 따라서 프리컴퓨티드 비저빌리티는 배경에 대부분 스태틱 라이팅을 사용하고, 플레이어 이동이 제한적이며, 어느 정도 2D 플레이 영역이 있는 프로젝트에 가장 유용합니다.
비저빌리티 셀은 라이트 빌드 중 중에 그림자를 드리우는 지오메트리 위에 생성됩니다. 액터의 비저빌리티는 각 셀의 위치로부터 저장됩니다. 프리컴퓨티드 비저빌리티는 오프라인으로 생성되므로, 보통 하드웨어 오클루전 쿼리가 차지하는 렌더링 스레드 시간을 런타임 메모리 및 라이팅 빌드 시간의 증가와 맞바꾸는 것입니다. 이를 염두에 두고, 비저빌리티 컬링을 유지하려면 플레이어 또는 카메라가 접근할 수 있는 영역에만 볼륨을 배치하는 것이 좋습니다.


구성 및 사용
시작하려면 먼저 레벨에 프리컴퓨티드 비저빌리티를 활성화해야 합니다. 이를 위해 월드 세팅(World Settings) 을 열고 프리컴퓨티드 비저빌리티(Precomputed Visibility) 섹션을 찾습니다. 비저빌리티 미리계산(Precompute Visibility) 옆의 체크 박스를 활성화하면 됩니다.

모드(Modes) 패널에서 프리컴퓨티드 비저빌리티 볼륨 을 레벨에 드래그 앤 드롭하고 플레이 가능 영역에 맞게 스케일을 조절합니다.
아래의 배치에서 최적의 결과를 얻기 위한 팁과 제안 사항을 확인할 수 있습니다.

프리컴퓨티드 비저빌리티 작동 전, 먼저 라이팅 빌드(Build Lighting) 를 수행하고 레벨 뷰포트에서 표시(Show) > 고급(Advanced) > 프리컴퓨티드 비저빌리티(Precomputed Visibility) 로 이동하여 프리컴퓨티드 비저빌리티 셀(파란색 박스)을 활성화해야 합니다.
볼륨을 배치할 때는 하나의 볼륨으로 전체 영역을 아우르기보다는 플레이어가 접근할 수 있는 영역에만 배치합니다. 그래야 사용할 수 없는 비저빌리티 데이터를 런타임에 저장하고 로드하지 않습니다.


이미 라이팅을 빌드했다면, 메인 툴바의 빌드(Build) 드롭다운에서 스태틱 비저빌리티 미리 계산(Precompute Static Visibility) 을 선택하여 매번 라이팅을 리빌드할 필요 없이 비저빌리티 셀을 생성할 수 있습니다.

비저빌리티 셀
레벨에 라이팅 정보를 최소 한 번 빌드한 이후에는 프리컴퓨티드 비저빌리티 볼륨을 얼마든지 배치하여, 스태틱 섀도를 드리우는 액터의 표면을 채우는 비저빌리티 셀을 생성할 수 있습니다. 스태틱 비저빌리티는 메인 툴바의 빌드 드롭다운 메뉴에서 스태틱 비저빌리티 미리 계산 옵션을 선택하여 생성할 수 있습니다.


r.ShowRelevantPrecomputedVisibilityCells 를 사용하면 프리컴퓨티드 비저빌리티 셀 표시(Precomputed Visibility Cells) 의 표시 플래그가 활성화되었을 때 카메라 근처의 비저빌리티 셀만 표시합니다. 이를 통해 화면에 한 번에 표시되는 많은 셀을 줄일 수 있습니다.
이 씬의 경우, 프리컴퓨티드 비저빌리티 볼륨을 배치하고(녹색) 라이팅을 빌드하니 일부 액터가 벽과 문에 가려집니다.
아래는 셀에 액터 위치를 저장하는 프리컴퓨티드 비저빌리티 작동 방식을 이해할 수 있도록 벽과 문 일부가 숨겨졌습니다. 슬라이더를 드래그하여 카메라 위치를 이동하면 카메라 위치 및 카메라가 있는 셀에 따라 비저빌리티 상태가 변하는 것이 보입니다.
프리컴퓨티드 비저빌리티 셀은 예시 이미지에서 보이지 않는데, 이는 가려진 액터의 비저빌리티 상태를 보다 잘 표시하기 위해서입니다.






프리컴퓨티드 비저빌리티가 생성되었으면 셀에는 셀의 위치에서 보이는 액터가 저장됩니다. 이 예시에서 셀은 무엇이 보이고 무엇이 보이지 않는지 알고 있으므로, 벽과 문 등의 가리는 액터를 숨길 수 있으며 카메라가 프리컴퓨티드 비저빌리티 셀 안에 있는 한 가려진 액터는 보이지 않습니다. 따라서 이러한 컬링 메서드는 일부 게임 유형과 플랫폼에 적합한 절충안 역할을 합니다.
게임플레이용 셀 플레이 영역 높이 설정
프리컴퓨티드 비저빌리티를 사용할 때 한 가지 유념할 점은 스케일이 게임에 따라 다르므로 비저빌리티 파라미터를 각 게임에 맞게 설정해야 한다는 것입니다.
이렇게 하려면 [언리얼 엔진 루트 디렉터리]/Engine/Config
폴더에 있는 BaseLightmass.ini
파일의 세팅을 변경하면 됩니다. DevOptions.PrecomputedVisibility
섹션을 찾습니다.
[DevOptions.PrecomputedVisibility]
bVisualizePrecomputedVisibility=False
bCompressVisibilityData=True
bPlaceCellsOnOpaqueOnly=True
NumCellDistributionBuckets=800
CellRenderingBucketSize=5
NumCellRenderingBuckets=5
PlayAreaHeight=220
MeshBoundsScale=1.2
VisibilitySpreadingIterations=1
MinMeshSamples=14
MaxMeshSamples=40
NumCellSamples=24
NumImportanceSamples=40
이러한 세팅 중에서 주목할 것은 PlayAreaHeight
입니다. 이 값은 비저빌리티 셀이 위치할 표면 위 높이(언리얼 유닛 단위)입니다. 이는 게임에서 카메라가 표면 위로 올라갈 수 있는 최대 높이이며, 보통 키가 가장 큰 플레이어의 눈높이에 점프 높이를 더한 값입니다.
환경설정 파일의 PlayAreaHeight
또는 다른 세팅을 설정해도 엔진을 재시작할 필요는 없습니다. .ini 파일을 편집하고 저장한 다음 메인 툴바의 빌드 메뉴 드롭다운에서 스태틱 비저빌리티 미리 계산 을 사용하면 됩니다.


삼인칭(ThirdPerson) 템플릿을 사용하는 경우 이 게임 타입의 PlayAreaHeight를 결정할 때 고려해야 할 사항이 몇 가지 있습니다.

- 카메라의 가장 높은 회전 지점을 찾습니다.
- 카메라는 삼인칭 템플릿의 캐릭터 주위를 360도 회전할 수 있습니다. 가장 높은 지점은 지면 위로 약 395 유닛입니다.
- 플레이어의 점프 높이입니다.
- 플레이어가 점프할 수 있는 높이는 약 210 유닛입니다.
- 카메라가 위치할 수 있는 최대 높이입니다.
- 플레이어의 점프 높이(210유닛)에 카메라의 최고 위치(365유닛)을 더하면 카메라가 셀을 벗어나지 않고 위치할 수 있는 최대 높이는 615 유닛입니다.
어떤 수직 회전에서도 카메라를 비저빌리티 셀 내에 유지하려면 PlayAreaHeight가 최소 615유닛은 되어야 한다는 것을 알았으니, 카메라를 유지하기 위하여 버퍼를 약간 추가합니다. 버퍼를 포함한 높이는 650 유닛이 됩니다. 이러한 게임 타입과 카메라 이동의 경우 셀의 높이를 이 정도로 높게 잡는 것이 타당합니다. 그러나 PlayAreaHeight 값이 클수록 저장해야 하는 액터 비저빌리티 상태가 많아지므로 런타임 메모리를 더 많이 필요로 한다는 점에 유의하세요.
프리컴퓨티드 비저빌리티 오버라이드 볼륨 사용하기
프리컴퓨티드 비저빌리티 오버라이드 볼륨(Precomputed Visibility Override Volumes) 은 프리컴퓨티드 비저빌리티 볼륨의 자동 생성된 결과가 마음에 들지 않을 경우 월드 내 액터 위치에서 액터 비저빌리티를 수동으로 오버라이드할 수 있습니다. 이는 퍼포먼스 최적화에도 사용되며, 플레이어가 액세스할 수 있는 영역에만 배치해야 합니다.
배치
이 볼륨을 사용하려면, 모드 패널에서 프리컴퓨티드 비저빌리티 오버라이드 볼륨 을 레벨로 드래그 앤 드롭하고 플레이 가능 영역에 맞게 스케일을 조절합니다.

더하기(+) 버튼으로 배열 목록에 엘리먼트를 얼마든지 추가할 수 있습니다.

추가된 각 엘리먼트에 스포이드 아이콘 또는 드롭다운 선택을 사용하여 액터 또는 레벨을 추가합니다.

자세한 내용은 비저빌리티 및 오클루전 컬링 세팅을 참조하세요.
관련 통계
프리컴퓨티드 비저빌리티의 퍼포먼스를 확인할 때 Initviews 및 Memory 통계를 먼저 살펴보는 것이 좋습니다. 이 두 통계 패널은 프리컴퓨티드 비저빌리티의 퍼포먼스가 얼마나 좋은지, 프로세스에서 런타임에 사용하는 메모리가 얼마나 되는지 알려줍니다.
Stat Initviews
stat initviews 명령으로 레벨의 프리컴퓨티드 비저빌리티가 얼마나 효과적인지 확인할 수 있습니다.
이미지를 클릭하면 최대 크기로 볼 수 있습니다.
통계 | 설명 |
---|---|
정적으로 가려진 프리미티브(Statically Occluded Primitives) | 프러스텀 컬링이 일어난 후 프리컴퓨티드 비저빌리티에 의해 보이지 않는다고 판단된 프리미티브의 개수를 표시합니다. 카메라 뷰가 비저빌리티 셀 안에 있을 때만 표시됩니다. |
가려진 프리미티브(Occluded Primitives) | 프리컴퓨티드 비저빌리티 및 다이내믹 오클루전 시스템 양쪽에 의해 보이지 않는다고 판단된 프리미티브의 개수를 표시합니다. |
오클루전 압축 해제(Decompress Occlusion) | 프리컴퓨티드 비저빌리티 압축 해제에 걸린 시간을 표시합니다. 볼륨이 크거나 셀 크기가 작으면 메모리 사용량이 늘어 압축 해제에 걸리는 시간에 영향을 줄 수 있습니다. |
값이 보이지 않는 경우 카메라가 비저빌리티 셀 밖에 있거나 프리컴퓨티드 비저빌리티가 생성되지 않았을 가능성이 있습니다.

정적으로 가려진 프리미티브 개수가 예상보다 적을 경우, 월드 세팅 > 프리컴퓨티드 비저빌리티 에서 비저빌리티 공격성(Visibility Aggressiveness) 을 살펴보면 됩니다. 공격적인 세팅이 많아질수록 컬링되는 액터가 많아지지만, 모서리 주위에서 액터가 튀는 현상 등 비저빌리티 오류도 늘어납니다.
Stat Memory
stat memory 명령을 사용하면 게임에, 구체적으로는 프리컴퓨티드 비저빌리티에 할당되고 있는 메모리 사용량을 파악할 수 있습니다.
이미지를 클릭하면 최대 크기로 볼 수 있습니다.
프리컴퓨티드 비저빌리티 메모리(Precomputed Visibility Memory) 통계에는 프리컴퓨티드 비저빌리티에 현재 사용되고 있는 실제 런타임 메모리 사용량이 표시됩니다.

이 통계는 에디터에서 플레이(PIE) 모드에서 신뢰도가 높지 않습니다. 메모리 사용량이 에디터와 PIE 둘 모두에서 동시에 카운트되기 때문입니다. 대신 에디터를 게임 뷰 모드에서만 사용하거나 독립형 게임만 사용하면 가장 정확한 결과를 얻을 수 있습니다.
제한 사항
프리컴퓨티드 비저빌리티의 제한 사항은 다음과 같습니다.
- 무버블 액터는 처리하지 않습니다.
- 불투명이 아닌 머티리얼, 즉 반투명이나 마스크드 머티리얼은 처리하지 않습니다.
- 셀이 표면 위에만 배치됩니다. 비행 모드가 있는 프로젝트에는 별로 도움이 되지 않습니다.
- 레벨 스트리밍을 효율적으로 처리하지 않습니다. 모든 데이터는 퍼시스턴트 레벨에 저장됩니다.
- 스태틱 섀도를 드리우는 트라이앵글만 가립니다.