Wykonywanie zapytań dotyczących obsługi buforu głębokości (Direct3D 9)
Podobnie jak w przypadku każdej funkcji sterownik używany przez aplikację może nie obsługiwać wszystkich typów buforowania głębokości. Zawsze sprawdzaj możliwości sterownika. Mimo że większość sterowników obsługuje buforowanie głębokości oparte na współrzędnej z, nie wszystkie będą obsługiwać buforowanie głębokości oparte na współrzędnej w. Sterowniki nie ulegają awarii, jeśli próbujesz włączyć nieobsługiwany schemat. Zamiast tego wracają do innej metody buforowania głębokości lub czasami wyłączają buforowanie głębokości, co może spowodować renderowanie scen z ekstremalnymi artefaktami sortowania głębokości.
Możesz sprawdzić ogólną obsługę buforów głębokości, wysyłając zapytanie do Direct3D dla urządzenia wyświetlającego, które twoja aplikacja będzie używać, przed utworzeniem urządzenia Direct3D. Jeśli obiekt Direct3D zgłasza, że obsługuje buforowanie głębokości, wszystkie urządzenia sprzętowe tworzone na podstawie tego obiektu Direct3D będą obsługiwać buforowanie z.
Aby wykonać zapytanie dotyczące obsługi buforowania głębokości, możesz użyć metody IDirect3D9::CheckDeviceFormat, jak pokazano w poniższym przykładzie kodu.
// The following example assumes that pCaps is a valid pointer to an
// initialized D3DCAPS9 structure
if(FAILED(m_pD3D->CheckDeviceFormat(pCaps->AdapterOrdinal,
pCaps->DeviceType,
AdapterFormat,
D3DUSAGE_DEPTHSTENCIL,
D3DRTYPE_SURFACE,
D3DFMT_D16)))
return E_FAIL;
IDirect3D9::CheckDeviceFormat umożliwia wybranie urządzenia do utworzenia na podstawie możliwości tego urządzenia. W takim przypadku urządzenia, które nie obsługują 16-bitowych buforów głębokości, są odrzucane.
Użycie IDirect3D9::CheckDepthStencilMatch w celu określenia zgodności wzornika głębokości z obiektem docelowym renderowania przedstawiono w poniższym przykładzie kodu.
// Reject devices that cannot create a render target of RTFormat while
// the back buffer is of RTFormat and the depth-stencil buffer is
// at least 8 bits of stencil
if(FAILED(m_pD3D->CheckDepthStencilMatch(pCaps->AdapterOrdinal,
pCaps->DeviceType,
AdapterFormat,
RTFormat,
D3DFMT_D24S8)))
return E_FAIL;
Gdy wiesz, że sterownik obsługuje bufory głębi, możesz sprawdzić obsługę buforów w. Chociaż bufory głębokości są obsługiwane przez wszystkie oprogramowania rasteryzujące, bufory w są obsługiwane tylko przez rasteryzator referencyjny, który nie jest odpowiedni do użycia przez rzeczywiste aplikacje. Niezależnie od typu urządzenia, którego używa Twoja aplikacja, sprawdź obsługę buforów w przed podjęciem próby włączenia buforowania głębokości opartego na w.
- Po utworzeniu urządzenia wywołaj metodę IDirect3DDevice9::GetDeviceCaps, przekazując zainicjowaną strukturę D3DCAPS9.
- Po wywołaniu element członkowski LineCaps zawiera informacje o obsłudze sterownika do renderowania elementów pierwotnych.
- Jeśli element członkowski RasterCaps tej struktury zawiera flagę D3DPRASTERCAPS_WBUFFER, to sterownik obsługuje buforowanie głębokości oparte na w dla tego typu prymitywu.
Tematy pokrewne