初始化D3D设备

 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 }
原文地址:https://www.cnblogs.com/lc-cnblong/p/3365039.html