Interrogation de la prise en charge de la mémoire tampon de profondeur (Direct3D 9)

Comme avec n’importe quelle fonctionnalité, le pilote utilisé par votre application peut ne pas prendre en charge tous les types de mise en mémoire tampon de profondeur. Toujours case activée les fonctionnalités du pilote. Bien que la plupart des pilotes prennent en charge la mise en mémoire tampon de profondeur basée sur z, tous ne prennent pas en charge la mise en mémoire tampon de profondeur basée sur w. Les pilotes n’échouent pas si vous tentez d’activer un schéma non pris en charge. Ils se replient sur une autre méthode de mise en mémoire tampon de profondeur à la place, ou parfois désactivent complètement la mise en mémoire tampon de profondeur, ce qui peut entraîner des scènes rendues avec des artefacts de tri de profondeur extrême.

Vous pouvez case activée pour la prise en charge générale des mémoires tampons de profondeur en interrogeant Direct3D pour le périphérique d’affichage que votre application utilisera avant de créer un appareil Direct3D. Si l’objet Direct3D indique qu’il prend en charge la mise en mémoire tampon de profondeur, tous les périphériques matériels que vous créez à partir de cet objet Direct3D prennent en charge la mise en mémoire tampon z.

Pour rechercher la prise en charge de la mise en mémoire tampon de profondeur, vous pouvez utiliser la méthode IDirect3D9::CheckDeviceFormat , comme indiqué dans l’exemple de code suivant.

// 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 vous permet de choisir un appareil à créer en fonction des fonctionnalités de cet appareil. Dans ce cas, les appareils qui ne prennent pas en charge les tampons de profondeur 16 bits sont rejetés.

L’utilisation de IDirect3D9::CheckDepthStencilMatch pour déterminer la compatibilité profondeur-gabarit avec une cible de rendu est illustrée dans l’exemple de code suivant.

// 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;

Quand vous savez que le pilote prend en charge les mémoires tampons de profondeur, vous pouvez vérifier la prise en charge de w-buffer. Bien que les tampons de profondeur soient pris en charge pour tous les rastériseurs logiciels, les w-buffers sont pris en charge uniquement par le rastériseur de référence, qui n’est pas adapté à une utilisation par les applications réelles. Quel que soit le type d’appareil utilisé par votre application, vérifiez la prise en charge des w-buffers avant d’essayer d’activer la mise en mémoire tampon de profondeur basée sur w.

  1. Après avoir créé votre appareil, appelez la méthode IDirect3DDevice9::GetDeviceCaps , en passant une structure D3DCAPS9 initialisée.
  2. Après l’appel, le membre LineCaps contient des informations sur la prise en charge du pilote pour le rendu des primitives.
  3. Si le membre RasterCaps de cette structure contient l’indicateur D3DPRASTERCAPS_WBUFFER, le pilote prend en charge la mise en mémoire tampon de profondeur basée sur w pour ce type primitif.

Mémoires tampons de profondeur