1 bool initD3D(HWND hWnd) 2 { 3 4 // 主要目的是获取设备,为调用下面的函数做很多准备。 5 // 比如 获取IDirect3D9 ,获取支持的顶点处理,填充后备缓冲相关参数等。 6 7 // IDirect3D9::CreateDevice( 8 //UINT Adapter, 9 //D3DDEVTYPE DeviceType, 10 //HWND hFocusWindow, 11 //DWORD BehaviorFlags, 12 //D3DPRESENT_PARAMETERS *pPresentationParameters, 13 //IDirect3DDevice9 ** ppReturnDeviceInterface 14 //); 15 16 // 第一步 获取 IDirect3D9 接口 17 // Direct3DCreate9(D3D_SDK_VERSION); 18 pD3D = Direct3DCreate9(D3D_SDK_VERSION); 19 if (NULL == pD3D) 20 { 21 MessageBox(NULL,TEXT("NULL == pD3D"),NULL,MB_OK); 22 return false; 23 } 24 // 第二步 确定显卡是否支持顶点转换和光照 25 // 通过获取设备性能,里面包含顶点处理,纹理,shader等信息。 26 // pD3D->GetDeviceCaps(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,&caps) 27 // caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT 28 D3DCAPS9 caps; 29 pD3D->GetDeviceCaps(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,&caps); 30 31 int vp = 0; 32 if (caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT) 33 { 34 vp = D3DCREATE_HARDWARE_VERTEXPROCESSING; 35 } 36 else 37 { 38 vp = D3DCREATE_SOFTWARE_VERTEXPROCESSING; 39 } 40 41 42 // 第三步 填充显示参数,主要是和后备缓冲相关的设置。 43 D3DPRESENT_PARAMETERS d3dpp; 44 d3dpp.AutoDepthStencilFormat = D3DFMT_D24S8; 45 d3dpp.BackBufferCount = 1; 46 d3dpp.BackBufferFormat = D3DFMT_A8R8G8B8; 47 d3dpp.BackBufferHeight = SCREEN_H; 48 d3dpp.BackBufferWidth = SCREEN_W; 49 d3dpp.EnableAutoDepthStencil = true; 50 //d3dpp.FullScreen_RefreshRateInHz = 0; // 屏幕刷新频率,默认值即可 51 d3dpp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT; // 屏幕刷新频率,默认值即可 52 d3dpp.Windowed = true; 53 d3dpp.hDeviceWindow = hWnd; // 窗口句柄。 54 d3dpp.MultiSampleQuality = 0; 55 d3dpp.MultiSampleType = D3DMULTISAMPLE_NONE; 56 //d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE; 57 d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_DEFAULT; 58 // D3DPRESENT_INTERVAL_IMMEDIATE 图形绘制完后立即显示,实时的,可以提高帧率,但过快会产生图形撕裂。 59 // D3DPRESENT_INTERVAL_DEFAULT 则需等待屏幕刷新完后绘制 60 d3dpp.Flags = 0; // 附加特性一般为0. 61 62 // d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; // 这个一定要赋值(即使初始化为0),枚举值从1开始 63 d3dpp.SwapEffect = D3DSWAPEFFECT_COPY; // 这个一定要赋值(即使初始化为0),枚举值从1开始 64 //d3dpp.SwapEffect = D3DSWAPEFFECT_FLIP; // 这个一定要赋值(即使初始化为0),枚举值从1开始 65 // 使用FLIP 屏幕有很强的抖动,难道是交换链的切换和显示不同步所致??。 66 // 67 68 69 // 第四步 创建设备。 70 71 // IDirect3D9::CreateDevice( 72 //UINT Adapter, 73 //D3DDEVTYPE DeviceType, 74 //HWND hFocusWindow, 75 //DWORD BehaviorFlags, 76 //D3DPRESENT_PARAMETERS *pPresentationParameters, 77 //IDirect3DDevice9 ** ppReturnDeviceInterface 78 //); 79 80 pD3D->CreateDevice( 81 D3DADAPTER_DEFAULT, 82 D3DDEVTYPE_HAL, 83 hWnd, 84 vp, 85 &d3dpp, 86 &pD3DDev 87 ); 88 89 if (NULL == pD3DDev) 90 { 91 MessageBox(NULL,TEXT("NULL == pD3DDev"),NULL,MB_OK); 92 return false; 93 } 94 95 return true; 96 }