정밀도 문제와 기타 등등 문제들이 있지만 의도한대로 작동은 한다.
영상의 앞부분은 PVS를 사용하지 않고 KD-Tree와 View Frustum culling만을 사용하여 렌더링.
당연히 가려지는 매시들을 상당수 그리고 있다.
뒷부분은 미리 계산한 가시성 테이블을 이용하여 렌더링.
100%는 아니지만 꽤 많은 수의 가려지는 매시들을(leaf단위로 잘려있는) 미리 걸러낸다.
조금 더 부연하면
KD-Tree를 타고 현재 카메라의 eye 점이 있는 leaf를 탐색. 해당 leaf에서 1비트 단위로 저장된 가시성 테이블로부터 이 위치에서 보여질 수 있는 다른 leaf들을 수집.
구현 수순은 다음과 같다.
1. 월드 공간을 KD-Tree로 분할.
2. 삼각형과 교차하지 않는 공간이 leaf가 된다. 또는 특정 사이즈 이하로 공간이 작아지면 leaf가 된다.
3. leaf가 삼각형과 교차하는 경우 서브 트리로 분할. 서브트리에서 다시 삼각형과 교차하지 않는 leaf의 AABB만 수집
4. 분할 작업을 통해 삼각형과 교차하지 않는 공간목록의 AABB를 수집한다. 이것들을 pure cell이라고 부른다.
5. KD-Tree의 leaf에 포함된 pure cell을 순회하며 월드를 360도 렌더링. Z-Test로 보이는 공간들을 탐색.
6. 각 pure cell로부터 수집한 보이는 공간의 번호를 pure cell이 포함된 공간(leaf)에 추가. 숫자 그대로 저장하면 메모리를 많이 낭비하게 되므로 1비트 단위의 비트 테이블로 저장.
7. 렌더링 할때는 KD-Tree를 타고 leaf를 먼저 찾은후 해당 leaf에서 보여지는 다른 leaf들의 목록을 곧바로 얻는다. 각 leaf는 렌더링될 매시들을 가지고 있다.