언리얼 렌더링 파이프라인 중 BeginInit에서 가시성을 판단하여 불필요한 Draw를 줄인다.
해당 문서에서는 가시성 판단 과정을 상세히 기술하겠다.
아래 함수를 통해 3단계를 통해 가시성을 판단한다.
FVisibilityViewPacket::BeginInitVisibilityFrustumCullOcclusionCullComputeRelevence가시성 판단에는 아래 4가지 기법을 사용한다.
비트맵 기반
View.PrimitiveVisibilityMap
워드 단위 병렬 분할
WorkerThread x NumFrustumCullTaskPerThread기준으로 태스크 수 결정
CommandPipe 단계로 연결

AlwaysVisible 최적화
PrimitivesAlwaysVisibleOffset 이후의 프리미티브는 컬링 테스트 제외
View별로 WORD 블록을 돌면서 비트별로 판정한다.
여러 테스트를 진행하며, 비용 낮은 -> 높은 테스트 순서로 진행한다.

프리미티브가 View Frusutm 내부에 있는지 확인




프리미티브가 다른 물체에 가려지지 않았는지 확인
프러스텀+거리 통과시에만 테스트한다.
이전 프레인 쿼리 결과를 이번 프레임 테스트에 사용하는 것이 특징이다. (temporal)
가림 판정
판정 방법은 총 3개가 있음
OcclusionFeedback
HZBOcclusion
이전 프레임 Mipmap Depth Depth로 만든 HZB에 BBox를 한번에 테스트
바운드 박스를 스크린공간으로 투영 -> 박스의 가장 가까운 깊이 계산
밉레벨 선택

GPU: HZB에 가림 테스트 해서 결과 텍스처에 write

CPU: readback을 잠궈 ResultsBuffer 포인터에 연결

occlusion query

이전 프레임 정보 저장
이전 프레임 HZB 저장

오클루전 쿼리 정보 저장

쿼리요청
InstanceOcclusionQueryMask에 결과 저장 (다음 프레임 사용)
LastPixelsPercentage, LastProvenVisibleTime등을 통해 쿼리 여부를 결정
쿼리 결과사용

컬링을 통과한 보여줄 프리미티브를 어떤 렌더 패스로 어떻게 그릴지 분류하는 단계이다.
PrimitiveSceneProxy가 머티리얼+설정값을 보고 FPrimitiveViewRelevance에 값을 채운다.
Draw Type
!bDrawRelevance가 설정되어 DrawCommand 제외