Запрос на поддержку буфера глубины (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-буферов, прежде чем пытаться включить буферизацию глубины w.
- После создания устройства вызовите метод IDirect3DDevice9::GetDeviceCaps , передав инициализированную структуру D3DCAPS9 .
- После вызова член LineCaps содержит сведения о поддержке драйвера для отрисовки примитивов.
- Если элемент RasterCaps этой структуры содержит флаг D3DPRASTERCAPS_WBUFFER, драйвер поддерживает буферизацию глубины w для этого примитивного типа.
Связанные темы