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 }