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. Anche se la maggior parte dei driver supporta il buffer di profondità basato su z, non tutti supportano il buffer di profondità basato su w. I driver non riescono se si tenta di abilitare uno schema non supportato. Vengono restituiti invece un altro metodo di buffering di profondità o talvolta disabilitano completamente il buffer di profondità, che può causare il rendering di scene con artefatti di profondità estremi.

È possibile verificare il supporto generale per i buffer di profondità eseguendo query su Direct3D per il dispositivo visualizzato che l'applicazione userà 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 supportano il buffer z.

Per eseguire query sul supporto del buffer approfondito, è 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à di profondità-stencil con una destinazione di rendering viene 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 buffer di profondità, è possibile verificare il supporto del buffer w. Anche se i buffer di profondità sono supportati per tutti i rasterizzatori software, i buffer w sono supportati solo dal rasterizer 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.

  1. Dopo aver creato il dispositivo, chiamare il metodo IDirect3DDevice9::GetDeviceCaps , passando una struttura D3DCAPS9 inizializzata.
  2. Dopo la chiamata, il membro LineCaps contiene informazioni sul supporto del driver per il rendering delle primitive.
  3. Se il membro RasterCaps di questa struttura contiene il flag di D3DPRASTERCAPS_WBUFFER, il driver supporta il buffer di profondità basato su w per tale tipo primitivo.

Buffer di profondità