Direct初始化分为4个步骤:
- 获取接口IDirect3D的指针
- 校验硬件顶点运算
- D3DPRESENT_PARAMETER结构
- 创建IDirect3DDevice9接口
主流程代码如下:
//Step1: Create the IDirect3D9 object
IDirect3D9* d3d9 = 0;
d3d9 = Direct3DCreate9(D3D_SDK_VERSION);
if(!d3d9)
{
::MessageBox(NULL, "Direct3DCreate9() -- FAILED", 0, 0);
return false;
}
//Step2: Check for hardware vp
D3DCAPS9 caps;
d3d9->GetDeviceCaps(D3DADAPTER_DEFAULT, deviceType, &caps);
int vp = 0;
if(caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT)
vp = D3DCREATE_HARDWARE_VERTEXPROCESSING;
else
vp =D3DCREATE_SOFTWARE_VERTEXPROCESSING;
//Step3: Fill D3DPRESENT_PARAMETERS structure
D3DPRESENT_PARAMETERS d3dpp;
d3dpp.BackBufferWidth = width;
d3dpp.BackBufferHeight = height;
d3dpp.BackBufferFormat = D3DFMT_A8R8G8B8;
d3dpp.BackBufferCount = 1;
d3dpp.MultiSampleType = D3DMULTISAMPLE_NONE;
d3dpp.MultiSampleQuality = 0;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.hDeviceWindow = hWnd;
d3dpp.Windowed = windowed;
d3dpp.EnableAutoDepthStencil = true;
d3dpp.AutoDepthStencilFormat = D3DFMT_D24S8;
d3dpp.Flags = 0;
d3dpp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;
d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;
//Step4: Create the Device
hr = d3d9->CreateDevice(
D3DADAPTER_DEFAULT,
deviceType,
hWnd,
vp,
&d3dpp,
device);
if(FAILED(hr))
{
d3dpp.AutoDepthStencilFormat = D3DFMT_D16;
hr = d3d9->CreateDevice(D3DADAPTER_DEFAULT,
deviceType,
hWnd,
vp,
&d3dpp,
device);
if(FAILED(hr))
{
d3d9->Release();
::MessageBox(NULL, "CreateDevice() -- FAILE", 0, 0);
return false;
}
}
浙公网安备 33010602011771号