핵심 정리
| 기법 | 제거 기준 |
|---|---|
| Frustum culling | 카메라 시야 밖 |
| Backface culling | 카메라 반대 방향 면 |
| Occlusion culling | 다른 물체에 가려짐 |
| Portal/PVS | 구역과 연결 관계 |
| Hi-Z culling | 깊이 pyramid로 가려짐 검사 |
구조
occlusion culling은 보이지 않는 물체를 GPU에 보내거나 그리지 않도록 줄이는 기법입니다. frustum culling은 카메라 시야 밖을 제거하지만, 시야 안에 있어도 벽 뒤에 있는 물체는 여전히 후보로 남습니다. 이 후보를 더 줄이는 것이 occlusion culling입니다.
object in frustum
-> check occluders/depth
-> hidden?
-> skip draw or skip detailed pass가려짐 검사는 CPU에서 미리 계산한 visibility data로 할 수도 있고, GPU depth buffer나 Hi-Z buffer를 사용해 할 수도 있습니다.
backface culling은 삼각형이 카메라 반대 방향을 향하면 그리지 않는 기하 단계의 제거입니다. portal과 PVS는 실내처럼 방과 문 구조가 뚜렷할 때 “이 구역에서 보일 수 있는 구역”을 미리 제한합니다.
occlusion culling은 실제 가림 관계를 봅니다. 건물, 벽, 산처럼 큰 occluder 뒤에 있는 객체를 줄일 때 효과가 크고, 열린 평야처럼 서로 가리는 구조가 적으면 이득이 작습니다.
Hi-Z
Hi-Z는 depth buffer를 여러 해상도의 pyramid로 만든 구조입니다. 큰 bounding box가 이미 더 가까운 깊이로 덮여 있는지 빠르게 검사할 수 있습니다.
선택 기준
| 상황 | 접근 |
|---|---|
| 실내 방/복도 구조 | portal, PVS |
| 도시처럼 큰 occluder 많음 | occlusion culling 효과 큼 |
| 열린 평야 | 효과 제한적 |
| GPU 기반 대량 객체 | Hi-Z, compute culling |
| 작은 물체가 많음 | culling 비용과 이득 비교 |
culling은 그 자체도 비용입니다. 검사 비용이 렌더링 절감보다 크면 오히려 느려질 수 있습니다.
주의할 점
occlusion 결과를 너무 늦게 알면 현재 프레임에는 이미 draw가 제출된 뒤일 수 있습니다. 실시간 렌더링에서는 한 프레임 늦은 결과를 쓰거나 GPU-driven pipeline과 결합하는 방식이 필요할 수 있습니다.
또 bounding box가 실제 물체보다 크면 보이는 것으로 판단되는 경우가 늘고, 너무 작거나 잘못 잡히면 popping이 생길 수 있습니다.
가시성 culling은 보수적으로 동작해야 합니다. 보이지 않는 물체를 그리는 것은 비용 문제지만, 보이는 물체를 숨기면 바로 시각적 오류가 됩니다.