예전에 BSP Tree + ROOM/PORTAL방식으로 만들었던 게임에 전용 맵툴 없이 자동화된 방법으로 culling을 적용할 방법을 생각해봤다.
Occlusion Culling은 GPU로 하는게 무조건 빠르지만 무조건 HW Occlusion Culling에 의존하면 occluder와 occludee를 그릴때 오브젝트 개수를 컨트롤할수가 없다.일단 GPU로 넘어가면야 빠르겠지만 그 과정도 상당히 길다.
그래서 CPU단에서 어느 정도는 컬링이 된 상태로 HW Occlusion culling을 시도해야한다.
그런 차원에서 트리를 탐색하는 과정에서 SW Occlusion Culling을 사용하는게 효과적일것이다.
1. 맵데이터를 복셀로 변환
2. 삼각형면을 포함하는 약간 넓은 복셀 데이터와 삼각형면의 안쪽만 채우는 복셀 데이터 두벌이 필요하다. 전자는 Occludee로, 후자는 Occluder로 사용
3. 복셀로부터 최적화된 삼각형 데이터를 생성.
4. KD-Tree에 맵데이터와 복셀로부터 추출한 삼각형 데이터를 집어넣는다.
5. 트리 순회시에 방문하는 노드들을 SW Z-Buffer로 occlusion culling. 렌더링 된다고 판정된 오브젝트들에 대해서 SW Z-Buffer에 rasterize.
성능 개선안
1. 화면을 뷰프러스텀을 CPU 코어 개수로 나누고 이에 따라 뷰프러스텀도 여러개로 만든다.
2. 뷰프러스텀 하나당 스레드 하나씩 할당해서 각각 KD-Tree탐색
3. 최종결과를 메인스레드가 정리. 중복선택된 오브젝트 제거 등.
4. 탐색도중 5ms이상 소요될 경우 SW Occlusion컬링을 끈다.