Share via


Consultando o suporte a buffer de profundidade (Direct3D 9)

Assim como acontece com qualquer recurso, o driver que seu aplicativo usa pode não dar suporte a todos os tipos de buffer de profundidade. Sempre marcar os recursos do driver. Embora a maioria dos drivers dê suporte ao buffer de profundidade baseado em z, nem todos darão suporte ao buffer de profundidade baseado em w. Os drivers não falharão se você tentar habilitar um esquema sem suporte. Em vez disso, eles retornam em outro método de buffer de profundidade ou, às vezes, desabilitam completamente o buffer de profundidade, o que pode resultar em cenas renderizadas com artefatos de classificação de profundidade extrema.

Você pode marcar para obter suporte geral para buffers de profundidade consultando Direct3D para o dispositivo de exibição que seu aplicativo usará antes de criar um dispositivo Direct3D. Se o objeto Direct3D relatar que ele dá suporte ao buffer de profundidade, todos os dispositivos de hardware criados com base nesse objeto Direct3D darão suporte ao buffer z.

Para consultar o suporte ao buffer de profundidade, você pode usar o método IDirect3D9::CheckDeviceFormat , conforme mostrado no exemplo de código a seguir.

// 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 permite que você escolha um dispositivo para criar com base nos recursos desse dispositivo. Nesse caso, os dispositivos que não dão suporte a buffers de profundidade de 16 bits são rejeitados.

O uso de IDirect3D9::CheckDepthStencilMatch para determinar a compatibilidade de estêncil de profundidade com um destino de renderização é ilustrado no exemplo de código a seguir.

// 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 você souber que o driver dá suporte a buffers de profundidade, você pode verificar o suporte a w-buffer. Embora haja suporte para buffers de profundidade para todos os rasterizadores de software, os w-buffers têm suporte apenas pelo rasterizador de referência, que não é adequado para uso por aplicativos do mundo real. Independentemente do tipo de dispositivo que seu aplicativo usa, verifique o suporte para w-buffers antes de tentar habilitar o buffer de profundidade baseado em w.

  1. Depois de criar seu dispositivo, chame o método IDirect3DDevice9::GetDeviceCaps , passando uma estrutura D3DCAPS9 inicializada.
  2. Após a chamada, o membro LineCaps contém informações sobre o suporte do driver para renderizar primitivos.
  3. Se o membro RasterCaps dessa estrutura contiver o sinalizador D3DPRASTERCAPS_WBUFFER, o driver oferecerá suporte ao buffer de profundidade baseado em w para esse tipo primitivo.

Buffers de profundidade