Esecuzione di query per il supporto del buffer di profondità (Direct3D 9)
Come per qualsiasi funzionalità, il driver usato dall'applicazione potrebbe non supportare tutti i tipi di buffer di profondità. Controllare sempre le funzionalità del driver. Sebbene la maggior parte dei driver supporti il buffer di profondità basato su z, non tutti supporteranno il buffer di profondità basato su w. I driver non falliscono se si tenta di abilitare uno schema non supportato. Eseguono invece il fallback su un altro metodo di buffering di profondità o talvolta disabilitano completamente il buffer di profondità, il che può comportare il rendering delle scene con elementi di ordinamento di profondità estremi.
È possibile verificare il supporto generale per i buffer di profondità eseguendo una query su Direct3D per il dispositivo di visualizzazione che verrà usato dall'applicazione prima di creare un dispositivo Direct3D. Se l'oggetto Direct3D segnala che supporta il buffer di profondità, tutti i dispositivi hardware creati da questo oggetto Direct3D supporteranno il buffer z.
Per eseguire una query per il supporto del buffer di profondità, è possibile usare il metodo IDirect3D9::CheckDeviceFormat, come illustrato nell'esempio di codice seguente.
// 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 consente di scegliere un dispositivo da creare in base alle funzionalità del dispositivo. In questo caso, i dispositivi che non supportano buffer di profondità a 16 bit vengono rifiutati.
L'uso di IDirect3D9::CheckDepthStencilMatch per determinare la compatibilità depth-stencil con una destinazione di rendering è illustrato nell'esempio di codice seguente.
// 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;
Quando si sa che il driver supporta i buffer di profondità, è possibile verificare il supporto del buffer w. Sebbene i buffer di profondità siano supportati per tutti i rasterizzatori software, i buffer w sono supportati solo dal rasterizzatore di riferimento, che non è adatto per l'uso da parte di applicazioni reali. Indipendentemente dal tipo di dispositivo usato dall'applicazione, verificare il supporto per i buffer w prima di tentare di abilitare il buffer di profondità basato su w.
- Dopo aver creato il tuo dispositivo, chiama il metodo IDirect3DDevice9::GetDeviceCaps, passando una struttura D3DCAPS9 inizializzata.
- Dopo la chiamata, il membro LineCaps contiene informazioni sul supporto del driver per le primitive di rendering.
- Se il membro RasterCaps di questa struttura contiene il flag D3DPRASTERCAPS_WBUFFER, il driver supporta il buffer di profondità basato su w per quel tipo primitivo.
Argomenti correlati