Поделиться через


Запрос на поддержку буфера глубины (Direct3D 9)

Как и в любой функции, драйвер, который использует приложение, может не поддерживать все типы буферизации глубины. Всегда проверяйте возможности драйвера. Хотя большинство драйверов поддерживают буферизацию глубины на основе Z, не все поддерживают буферизацию глубины на основе W. Драйверы не выдают ошибку, если вы пытаетесь активировать неподдерживаемую схему. Они возвращаются к другому методу буферизации глубины вместо этого или иногда отключают буферизацию глубины в целом, что может привести к отображению сцен с экстремальными артефактами сортировки глубины.

Вы можете проверить общую поддержку буферов глубины, запросив Direct3D для отображающего устройства, которое будет использоваться приложением перед созданием устройства Direct3D. Если объект Direct3D сообщает, что он поддерживает буферизацию глубины, все аппаратные устройства, создаваемые из этого объекта Direct3D, будут поддерживать z-буферизацию.

Чтобы запросить поддержку буферизации глубины, можно использовать метод IDirect3D9::CheckDeviceFormat, как показано в следующем примере кода.

// 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 позволяет выбрать создаваемое устройство на основе его возможностей. В этом случае устройства, не поддерживающие 16-разрядные буферы глубины, отклоняются.

Использование IDirect3D9::CheckDepthStencilMatch для определения совместимости элементов глубины с целевым объектом отрисовки показано в следующем примере кода.

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

Если вы знаете, что драйвер поддерживает буферы глубины, можно проверить поддержку w-buffer. Хотя буферы глубины поддерживаются для всех программных растризаторов, w-буферы поддерживаются только эталонным растризатором, который не подходит для использования в реальных приложениях. Независимо от типа устройства, используемого приложением, проверьте поддержку w-buffers перед попыткой включить буферизацию глубины на основе W.

  1. После создания устройства вызовите метод IDirect3DDevice9::GetDeviceCaps, передав инициализированную структуру D3DCAPS9.
  2. После вызова член LineCaps содержит информацию о поддержке драйвером функциональности отрисовки примитивов.
  3. Если элемент RasterCaps этой структуры содержит флаг D3DPRASTERCAPS_WBUFFER, то драйвер поддерживает буферизацию глубины на основе параметра W для данного типа примитива.

буферы глубины