Direct3D 9 硬件相关
1. IDirect3D9接口:
该接口用于创建D3D设备,设置环境。枚举设备属性。与硬件(显卡、显示器等)交互主要是使用这个接口。
2. 与显卡、显示器相关:
IDirect3D9::GetAdapterCount
得到适配器的数目。
IDirect3D9::GetAdapterIdentifier
得到显卡信息。如显卡名称、驱动程序、版本等。
IDirect3D9::GetAdapterMonitor
得到显示器句柄。
3. 设备性能:
IDirect3D9::CheckDeviceType
确认硬件加速设备是否能在该适配器上使用。
IDirect3D9::CheckDeviceMultiSampleType
检测设备的多抽样(multisampling)技术。该技术用于抗锯齿。
D3DCAPS9
描述设备性能。包含了光标性能、设备性能、光栅化性能、Z缓冲对比性能、源混合性能、目的混合性能、渲染性能、纹理性能、纹理过滤性能、纹理寻址性能等等。
IDirect3D9::GetDeviceCaps
得到设备详细信息。
4. D3D格式:
D3DFORMAT
定义各种类型的表面格式。
typedef enum _D3DFORMAT {
... (values)
} D3DFORMAT;
背景缓冲、显示格式(BackBuffer or Display Formats):
D3DFMT_A1R5G5B5
D3DFMT_A2R10G10B10
D3DFMT_A8R8G8B8
D3DFMT_R5G6B5
D3DFMT_X1R5G5B5
D3DFMT_X8R8G8B8
缓冲格式(Buffer Formats):
深度、模板、顶点以及索引缓冲,每个都有个独一无二的格式。
IDirect3D9::CheckDeviceFormat
指定资源种类(D3DDEVTYPE)、应用(D3DUSAGE),看一个表面格式是否可用。
IDirect3D9::CheckDepthStencilMatch
在一个特定的显示模式的适配器格式中,确认一个深度-模板格式与一个渲染-目标格式是否兼容。
HRESULT CheckDepthStencilMatch(
UINT Adapter,
D3DDEVTYPE DeviceType,
D3DFORMAT AdapterFormat, //显示模式中的格式。D3DDISPLAYMODE. Format
D3DFORMAT RenderTargetFormat, //背景缓冲格式(BackBuffer Format) 或者是显示格式(Display Format),应该等同上面的显示模式中的格式
D3DFORMAT DepthStencilFormat //缓冲格式(Buffer Formats)
);
实例代码:
BOOL IsDepthFormatOk(D3DFORMAT DepthFormat,
D3DFORMAT AdapterFormat,
D3DFORMAT BackBufferFormat)
{
// Verify that the depth format exists
HRESULT hr = pD3D->CheckDeviceFormat(D3DADAPTER_DEFAULT,
D3DDEVTYPE_HAL,
AdapterFormat,
D3DUSAGE_DEPTHSTENCIL,
D3DRTYPE_SURFACE,
DepthFormat);
if(FAILED(hr)) return FALSE;
// Verify that the depth format is compatible
hr = pD3D->CheckDepthStencilMatch(D3DADAPTER_DEFAULT,
D3DDEVTYPE_HAL,
AdapterFormat,
BackBufferFormat,
DepthFormat);
return SUCCEEDED(hr);
}
IDirect3D9::CheckDeviceFormatConversion
测试设备是否支持一种显示格式到另一种的转换。
5. 显示模式
D3DDISPLAYMODE
描述显示模式
typedef struct D3DDISPLAYMODE {
UINT Width;
UINT Height;
UINT RefreshRate;
D3DFORMAT Format;
} D3DDISPLAYMODE, *LPD3DDISPLAYMODE;
IDirect3D9::GetAdapterDisplayMode
得到适配器的当前显示模式。
IDirect3D9::GetAdapterModeCount
根据指定的表面格式得到适配器上有多少个可用的显示模式。
IDirect3D9::EnumAdapterModes
根据指定的表面格式枚举模式。
实例代码:
INT num_X8R8G8B8 = m_pD3D9->GetAdapterModeCount(D3DADAPTER_DEFAULT,D3DFMT_X8R8G8B8);//34
for (INT i=0;i<num_X8R8G8B8;i++)
{
m_pD3D9->EnumAdapterModes(D3DADAPTER_DEFAULT,D3DFMT_X8R8G8B8,i,&FMTmode);
}