며칠전 개발중인 D3D12렌더러에 Compute Shader를 이용한 Hi-Z Occlusion Culling을 만들어넣었었다. 물론 Occlusion Culling에 걸리는 시간으로만 보면 Hi-Z Occlusion Culling이 훨씬 빠르다. 그러나 Hi-Z Culling은 Bounding Sphere를 가지고 테스트 하기 때문에 정확도가 많이 떨어진다. 보이지 않는 오브젝트도 보인다고 판정할 확률이 높다.
그래서 이전 D3D11렌더러에서도 Hi-Z Culling이후에 D3DQUERY를 이용한 Occlusion Culling을 사용했다. D3DQUERY Occlusion Culling을 추가로 사용하면 대부분의 경우 20%정도는 빨라진다. 그리고 가려질 오브젝트가 물 오브젝트라면-수면에 반사되는 오브젝트들까지 같이 그리기 때문에-상당히 빨라진다.
구현 방법 자체는 D3D11과 아주 크게 다르진 않다.
D3D11에선 각각의 Query(Draw call)에 대해서 ID3D11Query객체 하나씩을 사용하지만 D3D12에선 ID3D12QueryHeap를 필요한 개수만큼 벌크 메모리로 할당해서 사용한다.
결과를 받을때는 ID3D12Resource로 8바이트짜리 버퍼를 Query개수만큼 만들어서 전달하고 이 버퍼에 ID3D12GraphicsCommandList::ResolveQueryData()로 결과를 저장한다.
HW Occlusion Culling 을 껐을때 현재 렌더링중인 오브젝트 507개