D3D12엔진개발 – D3DQUERY를 이용한 Occlusion Culling

며칠전 개발중인 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개 
d3d12_query_off

 

HW Occlusion Culling 을 켰을때  현재 렌더링중인 오브젝트 344개 
d3d12_query_on


답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Google+ photo

Google+의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

w

%s에 연결하는 중