查询 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 缓冲区的支持。

  1. 创建设备后,调用 IDirect3DDevice9::GetDeviceCaps 方法,传递初始化的 D3DCAPS9 结构。
  2. 调用后,LineCaps 成员包含有关驱动程序对呈现基元的支持的信息。
  3. 如果此结构的 RasterCaps 成员包含 D3DPRASTERCAPS_WBUFFER 标志,则驱动程序支持该基元类型的基于 w 的深度缓冲。

深度缓冲区