1: 获取IDirect3D9接口,主要用来查找物理硬件设备信息,和创建IDirect3DDevice9接口.代码如下:
IDirect3D9* pD3D = Direct3DCreate9(D3D_SDK_VERSION);
2: 验证硬件支持的显示模式,在 a shader approach 一书中,在窗口下使用当前显示模式作为显示格式和后台缓存格式,在全屏模式下使用D3DFMT_X8R8G8B8作为显示格式后台缓存格式.代码如下:
D3DDISPLAYMODE mode;
pD3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT,&mode);
//检查窗口模式
pD3D->CheckDeviceTyte(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,mode.Format,mode.Format,true);
//检查全屏模式
pd3d->CheckDeviceType(D3DADAPTER_DEFAULT, mDevType, D3DFMT_X8R8G8B8, D3DFMT_X8R8G8B8, false)
3: 检查硬件支持的顶点运算.如硬件顶点处理(hardware vertex processing)和(pure device),代码如下:
D3DCPAS9 cpas;
pD3D->GetDeviceCaps(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,&caps);
if(cpas.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT)
vp = D3DCREATE_HARDWARE_VERTEXPROCESSING;
else
vp = D3DCREATE_SOFTWARE_VERTEXPROCESSING;
if(cpas.DevCaps & D3DDEVCAPS_PUREDEVICE && cpas.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT)
vp |= D3DCREATE_PUREDEVICE;
4:初始化D3DPRESENT_PARAMETERS结构实例,该实例结构主要用来详细描述将要创建的IDirect3DDevice9接口.结构如下:
typedef struct _D3DPRESENT_PARAMETERS_ {
UINT BackBufferWidth;
UINT BackBufferHeight;
D3DFORMAT BackBufferFormat;
UINT BackBufferCount;
D3DMULTISAMPLE_TYPE MultiSampleType;
DWORD MultiSampleQuality;
D3DSWAPEFFECT SwapEffect;
HWND hDeviceWindow;
BOOL Windowed;
BOOL EnableAutoDepthStencil;
D3DFORMAT AutoDepthStencilFormat;
DWORD Flags;
UINT FullScreen_RefreshRateInHz;
UINT PresentationInterval;
} D3DPRESENT_PARAMETERS;
BackBufferWidth和BackBufferHeight: 描述后台缓存的宽高(以象素为单位)
BackBufferFormat:后台缓存的格式.一般设置为D3DFMT_UNKNOW
BackBufferCount:后台缓存的数量
MultiSampleType,MultiSampleQuality:多重采样,用于反走样和搞锯齿.
SwapEffect:后台缓存的换页方式,一般使用D3DSWAPEFFECT_DISCARD.
hDeviceWindow:和设备相关的窗口句柄,
Windowed: 应用程序是否窗口化
EnableAutoDepthStencil: 是否使用自动深度和模板缓存管理,一般设置为true;
AutoDepthStencilFormat:深度和模板缓存格式
Flags:一些附加的特性描述:一般设置为0;
FullScreen_RefreshRate:刷新频率:一般设置为D3DPRESENT_RATE_DEFAULT
PresentationInterval:后台缓存提交方式,一般设置为D3DPRESENT_INTERVAL_IMMEDIATE
表示立刻提交.
5:创建IDirect3DDevice9设备接口对象,代码如下:
pd3d->CreateDevice(
D3DADAPTER_DEFAULT, //主显卡
D3DDEVTYPE_HAL, // 设备类型
mhMainWnd, //窗口句柄
Vp, //顶点处理方式
&d3dPP, // D3DPRESENT_PARAMETERS参数
&pDevice)); // 返回创建的IDirect3DDevice9设备接口对象
md3dObject = Direct3DCreate9(D3D_SDK_VERSION);
if( !md3dObject )
{
MessageBox(0, "Direct3DCreate9 FAILED", 0, 0);
PostQuitMessage(0);
}
// Step 2: Verify hardware support for specified formats in windowed and full screen modes.
D3DDISPLAYMODE mode;
md3dObject->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &mode);
HR(md3dObject->CheckDeviceType(D3DADAPTER_DEFAULT, mDevType, mode.Format, mode.Format, true));
HR(md3dObject->CheckDeviceType(D3DADAPTER_DEFAULT, mDevType, D3DFMT_X8R8G8B8, D3DFMT_X8R8G8B8, false));
// Step 3: Check for requested vertex processing and pure device.
D3DCAPS9 caps;
HR(md3dObject->GetDeviceCaps(D3DADAPTER_DEFAULT, mDevType, &caps));
DWORD devBehaviorFlags = 0;
if( caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT )
devBehaviorFlags |= mRequestedVP;
else
devBehaviorFlags |= D3DCREATE_SOFTWARE_VERTEXPROCESSING;
// If pure device and HW T&L supported
if( caps.DevCaps & D3DDEVCAPS_PUREDEVICE &&
devBehaviorFlags & D3DCREATE_HARDWARE_VERTEXPROCESSING)
devBehaviorFlags |= D3DCREATE_PUREDEVICE;
// Step 4: Fill out the D3DPRESENT_PARAMETERS structure.
md3dPP.BackBufferWidth = 0;
md3dPP.BackBufferHeight = 0;
md3dPP.BackBufferFormat = D3DFMT_UNKNOWN;
md3dPP.BackBufferCount = 1;
md3dPP.MultiSampleType = D3DMULTISAMPLE_NONE;
md3dPP.MultiSampleQuality = 0;
md3dPP.SwapEffect = D3DSWAPEFFECT_DISCARD;
md3dPP.hDeviceWindow = mhMainWnd;
md3dPP.Windowed = true;
md3dPP.EnableAutoDepthStencil = true;
md3dPP.AutoDepthStencilFormat = D3DFMT_D24S8;
md3dPP.Flags = 0;
md3dPP.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;
md3dPP.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;
// Step 5: Create the device.
HR(md3dObject->CreateDevice(
D3DADAPTER_DEFAULT, // primary adapter
mDevType, // device type
mhMainWnd, // window associated with device
devBehaviorFlags, // vertex processing
&md3dPP, // present parameters
&gd3dDevice)); // return created device
}