1 //利用D2D渲染纹理
2 #include <Windows.h>
3 #include <d3dx9.h>
4 #include <d3d9.h>
5
6 #pragma comment(lib,"d3d9.lib")
7 #pragma comment(lib,"d3dx9.lib")
8 #pragma comment(lib,"winmm.lib")
9
10 #define WNDCLASSNAME ("ZMD3D")
11 #define WNDTITLE ("D3D Texture Mapping")
12 #define WNDWIDTH (640)
13 #define WNDHEIGHT (480)
14
15 //全局变量
16 LPDIRECT3D9 g_pD3d = NULL;
17 LPDIRECT3DDEVICE9 g_pD3dDev = NULL;
18 LPDIRECT3DTEXTURE9 g_Texture = NULL; //纹理
19 LPDIRECT3DVERTEXBUFFER9 g_pVB = NULL; //顶点缓冲区对象
20
21 //定义顶点格式
22 struct D3DVertex
23 {
24 float x,y,z,rhw; //3d坐标
25 DWORD diffuse; //顶点颜色
26 float tu,tv; //纹理uv坐标
27 };
28
29 D3DVertex g_Vertices[] =
30 {
31 {0.0f,0.0f,0.5f,1.0f,0xffffffff,0.0f,0.0f}, //v0
32 {256.0f,0.0f,0.5f,1.0f,0xffffffff,1.0f,0.0f}, //v1
33 {256.0f,256.0f,0.5f,1.0f,0xffffffff,1.0f,1.0f}, //v2
34
35 //{0.0f,0.0f,0.5f,1.0f,0xffffffff,0.0f,0.0f}, //v3
36 //{256.0f,256.0f,0.5f,1.0f,0xffffffff,1.0f,1.0f},//v4
37 {0.0f,256.0f,0.5f,1.0f,0xffffffff,0.0f,1.0f} //v5
38 };
39
40 //自定义顶点格式描述
41 #define D3DFVF_CUSTOM (D3DFVF_XYZRHW | D3DFVF_DIFFUSE|D3DFVF_TEX1)
42
43 //全局函数
44 //初始化d3d
45 bool InitializeD3D(HWND hWnd,bool bFullScreen);
46 //初始化渲染纹理
47 bool InitializeObject();
48 //渲染纹理
49 void RenderScene();
50 //释放资源
51 void CleanUp();
52
53 bool InitializeD3D(HWND hWnd,bool bFullScreen)
54 {
55 D3DDISPLAYMODE displayMode;
56 //创建D3D
57 g_pD3d = Direct3DCreate9(D3D_SDK_VERSION);
58 if (!g_pD3d)
59 {
60 return false;
61 }
62 //获取桌面显示模式
63 if (FAILED(g_pD3d->GetAdapterDisplayMode(D3DADAPTER_DEFAULT,&displayMode)))
64 {
65 return false;
66 }
67 //填充设备参数
68 D3DPRESENT_PARAMETERS d3dpp;
69 ZeroMemory(&d3dpp,sizeof(d3dpp));
70 if (bFullScreen)
71 {
72 d3dpp.Windowed = FALSE;
73 d3dpp.BackBufferWidth = WNDWIDTH;
74 d3dpp.BackBufferHeight = WNDHEIGHT;
75 }
76 else
77 {
78 d3dpp.Windowed = TRUE;
79 }
80 d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
81 d3dpp.BackBufferFormat = displayMode.Format;
82
83 //创建d3d设备
84 if (FAILED(g_pD3d->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hWnd,
85 D3DCREATE_HARDWARE_VERTEXPROCESSING,&d3dpp,&g_pD3dDev)))
86 {
87 return false;
88 }
89
90 //创建纹理
91 if (FAILED(D3DXCreateTextureFromFile(g_pD3dDev,"aa.bmp"/*"jpg_雪洞山壁.dds"*/,&g_Texture)))
92 {
93 return false;
94 }
95 //初始化渲染图像
96 if(!InitializeObject())
97 {
98 return false;
99 }
100 return true;
101 }
102 //D3D渲染2d精灵
103 void Render2D(LPDIRECT3DTEXTURE9 pTex,float fDestX,float fDestY,int nWidth,int nHeight)
104 {
105 if (pTex)
106 {
107 DWORD dwDiffuse = 0xffffffff;
108 D3DVertex vertex[4];
109 ZeroMemory(vertex,sizeof(vertex));
110 vertex[0].rhw = vertex[1].rhw = vertex[2].rhw = vertex[3].rhw = 1.0f;
111 vertex[0].z = vertex[1].z = vertex[2].z = vertex[3].z = 0.5f;
112 vertex[0].diffuse = vertex[1].diffuse = vertex[2].diffuse = vertex[3].diffuse = dwDiffuse;
113
114 vertex[0].y = vertex[1].y = fDestY; vertex[1].x = vertex[2].x = fDestX +nWidth;
115 vertex[0].x = vertex[3].x = fDestX; vertex[3].y = vertex[2].y = fDestY +nHeight;
116
117 vertex[0].tv = vertex[1].tv = 0.0f;
118 vertex[1].tu = vertex[2].tu = 1.0f;
119 vertex[0].tu = vertex[3].tu = 0.0f;
120 vertex[3].tv = vertex[2].tv = 1.0f;
121
122 //设置顶点格式
123 g_pD3dDev->SetFVF(D3DFVF_CUSTOM);
124 //设置纹理
125 g_pD3dDev->SetTexture(0,pTex);
126 g_pD3dDev->DrawPrimitiveUP(D3DPT_TRIANGLEFAN,2,&vertex,sizeof(D3DVertex));
127 }
128 }
129
130 bool InitializeObject()
131 {
132 //定义6个顶点绘制一个矩形
133 /*
134 v0 v1
135 v3|-----------|
136 | |
137 | |
138 | |
139 | |
140 v5 |-----------|v2
141 v4
142 */
143 D3DVertex Vertices[] =
144 {
145 {0.0f,0.0f,0.5f,1.0f,0xffffffff,0.0f,0.0f}, //v0
146 {256.0f,0.0f,0.5f,1.0f,0xffffffff,1.0f,0.0f}, //v1
147 {256.0f,256.0f,0.5f,1.0f,0xffffffff,1.0f,1.0f}, //v2
148
149 //{0.0f,0.0f,0.5f,1.0f,0xffffffff,0.0f,0.0f}, //v3
150 //{256.0f,256.0f,0.5f,1.0f,0xffffffff,1.0f,1.0f},//v4
151 {0.0f,256.0f,0.5f,1.0f,0xffffffff,0.0f,1.0f} //v5
152 };
153 //创建顶点缓冲区
154 /*if(FAILED(g_pD3dDev->CreateVertexBuffer(4*sizeof(D3DVertex),0,D3DFVF_CUSTOM,D3DPOOL_MANAGED,&g_pVB,NULL)))
155 {
156 return false;
157 }*/
158 //填充顶点缓冲
159 /*void *pVertices = NULL;
160 if (FAILED(g_pVB->Lock(0,sizeof(Vertices),(void **)&pVertices,0)))
161 {
162 return false;
163 }
164 memcpy(pVertices,Vertices,sizeof(Vertices));
165 g_pVB->Unlock();*/
166
167 return true;
168 }
169
170 //释放资源
171 void CleanUp()
172 {
173 if (g_Texture)
174 {
175 g_Texture->Release();
176 }
177 if(g_pVB)
178 {
179 g_pVB->Release();
180 }
181 if(g_pD3dDev)
182 {
183 g_pD3dDev->Release();
184 }
185 if(g_pD3d)
186 {
187 g_pD3d->Release();
188 }
189 }
190
191 void RenderScene()
192 {
193 //请客后台缓冲区
194 g_pD3dDev->Clear(0,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(0,0,0),1.0f,0);
195 if (SUCCEEDED(g_pD3dDev->BeginScene()))
196 {
197 //开始后台缓冲区绘制贴图
198 //g_pD3dDev->SetStreamSource(0,g_pVB,0,sizeof(D3DVertex));
199 //g_pD3dDev->SetFVF(D3DFVF_CUSTOM);
200 //g_pD3dDev->SetTexture(0,g_Texture);
201 //g_pD3dDev->DrawPrimitive(D3DPT_TRIANGLEFAN,0,2); //只要四个顶点 //使用自己创建顶点缓存
202 //g_pD3dDev->DrawPrimitiveUP(D3DPT_TRIANGLEFAN,2,&g_Vertices,sizeof(D3DVertex)); //使用内部动态顶点缓存
203 //结束后台缓冲区绘图
204
205 Render2D(g_Texture,150.0f,150.0f,256,256);
206 g_pD3dDev->EndScene();
207 }
208 //提交到前台缓冲区
209 g_pD3dDev->Present(0,0,0,0);
210 }
211
212 //消息处理
213 LRESULT WINAPI MsgProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam )
214 {
215 switch( msg )
216 {
217 case WM_DESTROY:
218 //程序结束时
219 CleanUp();
220 PostQuitMessage( 0 );
221 return 0;
222 }
223
224 return DefWindowProc( hWnd, msg, wParam, lParam );
225 }
226
227
228 //入口函数
229 int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd )
230 {
231 WNDCLASS winclass;
232 ZeroMemory(&winclass,sizeof(WNDCLASS));
233 winclass.style = CS_DBLCLKS | CS_OWNDC | CS_HREDRAW | CS_VREDRAW;
234 winclass.lpfnWndProc = MsgProc;
235 winclass.cbClsExtra = 0;
236 winclass.cbWndExtra = 0;
237 winclass.hInstance = hInstance;
238 winclass.hCursor = LoadCursor(NULL, IDC_ARROW);
239 winclass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
240 winclass.lpszMenuName = NULL;
241 winclass.lpszClassName = WNDCLASSNAME;
242 winclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
243
244 if (!RegisterClass(&winclass)) {
245 return -1;
246 }
247
248 int nX = ( GetSystemMetrics(SM_CXSCREEN) - WNDWIDTH)/2;
249 int nY = ( GetSystemMetrics(SM_CYSCREEN) - WNDHEIGHT)/2;
250
251 HWND hWnd = CreateWindow(WNDCLASSNAME,WNDTITLE,WS_CAPTION|WS_SYSMENU|WS_MINIMIZEBOX,
252 nX,nY,WNDWIDTH,WNDHEIGHT,NULL,NULL,hInstance,NULL);
253
254 if (!hWnd)
255 {
256 return -1;
257 }
258 //初始化d3d
259 if(InitializeD3D(hWnd,false))
260 {
261 //填充顶点,创建定点缓冲区
262 if(InitializeObject())
263 {
264 ShowWindow( hWnd, SW_SHOWDEFAULT );
265 UpdateWindow( hWnd );
266 //进入消息循环
267 MSG msg;
268 ZeroMemory(&msg,sizeof(msg));
269 while (msg.message != WM_QUIT)
270 {
271 if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
272 {
273 TranslateMessage(&msg);
274 DispatchMessage(&msg);
275 }
276 else
277 {
278 //进行渲染
279 RenderScene();
280 }
281 }
282 }
283 }
284
285 UnregisterClass(WNDCLASSNAME, winclass.hInstance);
286 return 0;
287 }