1 #include <Windows.h>
2 #include <d3dx9.h>
3 #include <d3d9.h>
4
5 #pragma comment(lib,"d3dx9.lib")
6 #pragma comment(lib,"d3d9.lib")
7 #pragma comment(lib,"winmm.lib")
8 //全局变量
9 LPDIRECT3D9 g_pD3D = NULL;
10 LPDIRECT3DDEVICE9 g_pDevice = NULL;
11
12 const int width = 800;
13 const int height = 600;
14
15 ID3DXMesh* pTeaPotMesh = NULL; //茶壶网格数据的指针
16
17 //初始化d3d
18 HRESULT InitD3D( HWND hWnd )
19 {
20 g_pD3D = Direct3DCreate9(D3D_SDK_VERSION);
21 if( !g_pD3D )
22 {
23 return S_FALSE;
24 }
25
26 D3DPRESENT_PARAMETERS d3dpp;
27 ZeroMemory(&d3dpp,sizeof(d3dpp));
28 d3dpp.BackBufferWidth = width;
29 d3dpp.BackBufferHeight = height;
30 d3dpp.BackBufferFormat = D3DFMT_A8R8G8B8;
31 d3dpp.BackBufferCount = 1;
32 d3dpp.MultiSampleType = D3DMULTISAMPLE_NONE;
33 d3dpp.MultiSampleQuality = 0;
34 d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
35 d3dpp.hDeviceWindow = hWnd;
36 d3dpp.Windowed = TRUE; //FLASE 表示全屏
37 d3dpp.EnableAutoDepthStencil = true;
38 d3dpp.AutoDepthStencilFormat = D3DFMT_D24S8;
39 d3dpp.Flags = 0;
40 d3dpp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;
41 d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;
42
43 //创建设备
44 HRESULT res = g_pD3D->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hWnd,D3DCREATE_HARDWARE_VERTEXPROCESSING,&d3dpp,&g_pDevice);
45 if (FAILED( res))
46 {
47 return S_FALSE;
48 }
49
50 return S_OK;
51 }
52 //释放资源
53 void CleanUp(void )
54 {
55 if(pTeaPotMesh ) pTeaPotMesh->Release();
56 if(g_pDevice) g_pDevice->Release();
57 if(g_pD3D) g_pD3D->Release();
58 }
59
60 //初始化网格数据
61 bool InitMeshData()
62 {
63 //创建网格数据
64 D3DXCreateTeapot(g_pDevice,&pTeaPotMesh,0);
65 if (!pTeaPotMesh )
66 {
67 return false;
68 }
69 //进行取景变换
70 D3DXVECTOR3 cameraPos(0.0f,0.0f,-5.0f); //世界坐标系中的摄像机位置
71 D3DXVECTOR3 targetPos(0.0f,0.0f,0.0f); //观察点坐标系
72 D3DXVECTOR3 worldUp(0.0f,1.0f,0.0f); //世界坐标系中表示向上的分量
73
74 //定义取景变换矩阵
75 D3DXMATRIX viewMat;
76 //获取取景变换矩阵
77 D3DXMatrixLookAtLH(&viewMat,&cameraPos,&targetPos,&worldUp);
78 g_pDevice->SetTransform(D3DTS_VIEW,&viewMat);
79
80 //投影变换
81 D3DXMATRIX projMat; //定义投影变换矩阵
82 //获取投影变换矩阵
83 D3DXMatrixPerspectiveFovLH(&projMat,D3DX_PI *0.5f,(float)width/height,1.0f,1000.0f);
84 //设置投影变换
85 g_pDevice->SetTransform(D3DTS_PROJECTION,&projMat);
86
87 //设置渲染模式,切换到线框模式
88 g_pDevice->SetRenderState(D3DRS_FILLMODE,D3DFILL_WIREFRAME);
89 return true;
90 }
91 //渲染函数
92 void Render(float deltaTime)
93 {
94 //绕Y轴旋转
95 D3DXMATRIX Ry;
96 static float y = 0.0f;
97 D3DXMatrixRotationY(&Ry,y);
98 y += deltaTime;
99
100 if(y >= D3DX_PI *2.0f)
101 y = 0.0f;
102
103 //世界变换
104 g_pDevice->SetTransform(D3DTS_WORLD,&Ry);
105
106 //清空屏幕为白色
107 g_pDevice->Clear(0,0,D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,0xffffffff,1.0f,0);
108
109 //开始绘制
110 if (SUCCEEDED(g_pDevice->BeginScene()))
111 {
112 //绘制茶壶
113 if (pTeaPotMesh)
114 {
115 pTeaPotMesh->DrawSubset(0);
116 }
117 g_pDevice->EndScene();
118 g_pDevice->Present(0,0,0,0);
119 }
120 }
121
122 //窗口过程声明
123 LRESULT WINAPI MgsProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam );
124
125 //winmain
126 int WINAPI WinMain(HINSTANCE hinstance,
127 HINSTANCE prevInstance,
128 PSTR cmdLine,
129 int showCmd)
130 {
131 WNDCLASSEX wc =
132 {
133 sizeof( WNDCLASSEX ), CS_CLASSDC, MgsProc, 0L, 0L,
134 GetModuleHandle( NULL ), NULL, NULL, NULL, NULL,
135 "Mesh", NULL
136 };
137 RegisterClassEx( &wc );
138
139 // Create the application's window
140 HWND hWnd = CreateWindow("Mesh", "Mesh",
141 WS_OVERLAPPEDWINDOW, 100, 100, width, height,
142 NULL, NULL, wc.hInstance, NULL );
143
144 if(SUCCEEDED(InitD3D(hWnd)))
145 {
146 if (InitMeshData())
147 {
148 //显示窗口
149 ShowWindow(hWnd,SW_SHOWDEFAULT);
150 UpdateWindow(hWnd);
151
152 MSG msg;
153 ZeroMemory(&msg,sizeof(MSG));
154 while(msg.message != WM_QUIT )
155 {
156 if (PeekMessage(&msg,NULL,0,0,PM_REMOVE))
157 {
158 TranslateMessage( &msg );
159 DispatchMessage( &msg );
160 }
161 else
162 {
163 //游戏循环
164 static float lastTime = (float)timeGetTime();
165 float curTime = (float)timeGetTime();
166 float timeDelta = (curTime - lastTime)*0.001f;
167 Render(timeDelta);
168 lastTime = curTime;
169 }
170 }
171 }
172 }
173 return 0;
174 }
175
176 //窗口过程函数
177 LRESULT WINAPI MgsProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam )
178 {
179 switch( msg )
180 {
181 case WM_DESTROY:
182 {
183 CleanUp();
184 PostQuitMessage(0);
185 return 0;
186 }
187 }
188 return DefWindowProc(hwnd,msg,wParam,lParam);
189 }