??1
#include?
<
D3DX9.h
>
??2
#include?
<
string
>
??3
typedef?std::
string
?String;
??4
#define
?SAFE_RELEASE(o)?{if(o){o->Release();o?=?0;}}
??5
??6
??7
LPDIRECT3D9?g_pD3D?
=
?
0
;????????????????
//
?D3D?Driver
??8
LPDIRECT3DDEVICE9?g_pd3dDevice?
=
?
0
;????
//
?D3D?設(shè)備
??9
D3DCAPS9?g_Caps?
=
?
{(D3DDEVTYPE)
0
}
;????
//
?D3D?的帽子
?10
LPDIRECT3DVERTEXBUFFER9?g_pVB?
=
?
0
;????
//
?頂點(diǎn)緩沖區(qū)
?11
LPDIRECT3DINDEXBUFFER9?g_pIB?
=
?
0
;????
//
?索引緩沖區(qū)
?12
LPDIRECT3DTEXTURE9?g_pTexture?
=
?
0
;????
//
?貼圖
?13
?14
//
?頂點(diǎn)定義
?15
#define
?D3DFVF_CUSTOMVERTEX?(D3DFVF_XYZ?|?D3DFVF_DIFFUSE?|?D3DFVF_TEX1)
?16
struct
?CUSTOMVERTEX
?17
{
?18
????D3DXVECTOR3?position;
?19
????D3DCOLOR?color;
?20
????
float
?u?,?v;
?21
}
;
?22
?23
//
?錯(cuò)誤記錄
?24
void
?D3DErr(String?strMsg)
?25
{
?26
????MessageBox(
0
?,?strMsg.c_str()?,?
"
錯(cuò)誤
"
?,?MB_OK);
?27
}
?28
?29
//
?初始化頂點(diǎn)緩沖區(qū)
?30
HRESULT?InitVB()
?31
{
?32
????
//
?創(chuàng)建頂點(diǎn)緩沖區(qū)
?33
????
if
(FAILED(g_pd3dDevice
->
CreateVertexBuffer(
4
?
*
?
sizeof
(CUSTOMVERTEX)?,?
0
?,?D3DFVF_CUSTOMVERTEX?,?D3DPOOL_DEFAULT?,?
&
g_pVB?,?
0
)))
?34
????????
return
?E_FAIL;
?35
?36
????CUSTOMVERTEX?
*
pVertecies;
?37
????
//
?鎖定緩沖區(qū)
?38
????
if
(SUCCEEDED(g_pVB
->
Lock(
0
?,?
0
?,?(
void
**
)
&
pVertecies?,?
0
)))
?39
????
{
?40
????????pVertecies[
0
].position?
=
?D3DXVECTOR3(
-
1
?,?
1
?,?
0
);
?41
????????pVertecies[
1
].position?
=
?D3DXVECTOR3(
-
1
?,?
-
1
?,?
0
);
?42
????????pVertecies[
2
].position?
=
?D3DXVECTOR3(
1
?,?
1
?,?
0
);
?43
????????pVertecies[
3
].position?
=
?D3DXVECTOR3(
1
?,?
-
1
?,?
0
);
?44
?45
????????pVertecies[
0
].u?
=
?
0
;
?46
????????pVertecies[
0
].v?
=
?
0
;
?47
?48
????????pVertecies[
1
].u?
=
?
0
;
?49
????????pVertecies[
1
].v?
=
?
1
;
?50
?51
????????pVertecies[
2
].u?
=
?
1
;
?52
????????pVertecies[
2
].v?
=
?
0
;
?53
?54
????????pVertecies[
3
].u?
=
?
1
;
?55
????????pVertecies[
3
].v?
=
?
1
;
?56
?57
????????pVertecies[
0
].color?
=
?
0xFFFFFFFF
;
?58
????????pVertecies[
1
].color?
=
?
0xFFFFFFFF
;
?59
????????pVertecies[
2
].color?
=
?
0xFFFFFFFF
;
?60
????????pVertecies[
3
].color?
=
?
0xFFFFFFFF
;
?61
????????g_pVB
->
Unlock();
?62
????}
?63
????
else
?64
????
{
?65
????????
return
?E_FAIL;
?66
????}
?67
?68
????
//
?載入紋理
?69
????
if
(FAILED(D3DXCreateTextureFromFile(g_pd3dDevice?,?
"
..\\..\\Media\\BRICE.JPG
"
?,?
&
g_pTexture)))
?70
????
{
?71
????????D3DErr(
"
無法載入紋理Brice.jpg
"
);
?72
????????
return
?E_FAIL;
?73
????}
?74
????
return
?S_OK;
?75
}
?76
?77
//
?初始化模型
?78
HRESULT?InitGeometry()
?79
{
?80
????
//
?創(chuàng)建頂點(diǎn)緩沖區(qū)
?81
????
if
(FAILED(InitVB()))
?82
????????
return
?E_FAIL;
?83
????
return
?S_OK;
?84
}
?85
?86
//
?設(shè)置矩陣變換
?87
void
?SetTransform()
?88
{
?89
?90
????
//
?世界變換
?91
????D3DXMATRIX?matWorld?,?matT1?,?matT2?,?matR;
?92
????D3DXMatrixIdentity(
&
matWorld);
?93
????
//
?設(shè)置世界矩陣
?94
????g_pd3dDevice
->
SetTransform(D3DTS_WORLD?,?
&
matWorld);
?95
????
//
?Set?up?our?view?matrix.?A?view?matrix?can?be?defined?given?an?eye?point,
?96
????
//
?a?point?to?lookat,?and?a?direction?for?which?way?is?up.?Here,?we?set?the
?97
????
//
?eye?five?units?back?along?the?z-axis?and?up?three?units,?look?at?the
?98
????
//
?origin,?and?define?"up"?to?be?in?the?y-direction.
?99
????
//
?視口變換
100
????D3DXMATRIX?matView;
101
????D3DXMatrixLookAtLH(
&
matView?,?
&
D3DXVECTOR3(
0
?,?
0
?,?
-
5
)
102
????????,?
&
D3DXVECTOR3(
0
?,?
0
?,?
0
)?
103
????????,?
&
D3DXVECTOR3(
0
?,?
1
?,?
0
));
104
????g_pd3dDevice
->
SetTransform(D3DTS_VIEW?,?
&
matView);
105
????
//
?For?the?projection?matrix,?we?set?up?a?perspective?transform?(which
106
????
//
?transforms?geometry?from?3D?view?space?to?2D?viewport?space,?with
107
????
//
?a?perspective?divide?making?objects?smaller?in?the?distance).?To?build
108
????
//
?a?perpsective?transform,?we?need?the?field?of?view?(1/4?pi?is?common),
109
????
//
?the?aspect?ratio,?and?the?near?and?far?clipping?planes?(which?define?at
110
????
//
?what?distances?geometry?should?be?no?longer?be?rendered).
111
????D3DXMATRIXA16?matProj;
112
????
//
?這里我曾經(jīng)犯了個(gè)大錯(cuò)!!把ZNear的參數(shù)傳0進(jìn)去了!這樣會導(dǎo)致一個(gè)很嚴(yán)重的問題。。你試試就知道。但是我想不通為何會出現(xiàn)這個(gè)問題。。我笨啊
113
????D3DXMatrixPerspectiveFovLH(?
&
matProj,?D3DX_PI
/
4
,?
1.0f
,?
1.0f
,?
100.0f
?);
114
????g_pd3dDevice
->
SetTransform(?D3DTS_PROJECTION,?
&
matProj?);
115
116
????
//
?紋理坐標(biāo)平移
117
????D3DXMATRIXA16?matTexture;
118
????D3DXMatrixIdentity(
&
matTexture);
119
????
//
?要使用3*3矩陣來平移2D紋理,所以要設(shè)置31來平移。不懂為什么要設(shè)置31的話看看《計(jì)算機(jī)圖形學(xué)》的2D變換那章
120
????matTexture._31?
=
?timeGetTime()?
%
?
3000
?
/
?
1500.0f
;
121
????g_pd3dDevice
->
SetTransform(D3DTS_TEXTURE0?,?
&
matTexture);
122
123
}
124
125
//
?渲染場景
126
void
?Render()
127
{
128
????
if
(g_pd3dDevice)
129
????
{
130
????????
//
?清空場景
131
????????g_pd3dDevice
->
Clear(
0
?,?
0
?,?D3DCLEAR_TARGET?
|
?D3DCLEAR_ZBUFFER?,?D3DCOLOR_XRGB(
0
?,?
0
?,?
0
)?,?
1
?,?
0
);
132
????????
//
?開始渲染
133
????????
if
(SUCCEEDED(g_pd3dDevice
->
BeginScene()))
134
????????
{
135
????????????SetTransform();
136
????????????g_pd3dDevice
->
SetTexture(
0
?,?g_pTexture);
137
????????????
//
?要想用矩陣來平移2D紋理,必須設(shè)置D3DTSS_TEXTURETRANSFORMFLAGS成D3DTTFF_COUNT2
138
????????????g_pd3dDevice
->
SetTextureStageState(
0
,?D3DTSS_TEXTURETRANSFORMFLAGS,?D3DTTFF_COUNT2);
139
????????????
//
?這句在這里可有可無
140
????????????g_pd3dDevice
->
SetTextureStageState(
0
,?D3DTSS_TEXCOORDINDEX,?
0
);
141
????????????
142
????????????g_pd3dDevice
->
SetSamplerState(
0
?,?D3DSAMP_ADDRESSU?,?D3DTADDRESS_MIRROR);
143
????????????g_pd3dDevice
->
SetSamplerState(
0
?,?D3DSAMP_ADDRESSV?,?D3DTADDRESS_MIRROR);
144
????????????g_pd3dDevice
->
SetRenderState(D3DRS_LIGHTING?,?FALSE);
145
????????????
//
g_pd3dDevice->SetRenderState(D3DRS_FILLMODE?,?D3DFILL_WIREFRAME);
146
????????????g_pd3dDevice
->
SetStreamSource(
0
?,?g_pVB?,?
0
?,?
sizeof
(CUSTOMVERTEX));
147
????????????g_pd3dDevice
->
SetFVF(D3DFVF_CUSTOMVERTEX);
148
????????????g_pd3dDevice
->
DrawPrimitive(D3DPT_TRIANGLESTRIP?,?
0
?,?
2
);
149
????????????g_pd3dDevice
->
EndScene();
150
????????}
151
????????
//
?顯示
152
????????g_pd3dDevice
->
Present(
0
?,?
0
?,?
0
?,?
0
);
153
????}
154
}
155
156
//
?初始化?D3D?設(shè)備
157
HRESULT?InitD3D(HWND?hWnd)
158
{
159
????
//
?創(chuàng)建?D3D?Driver
160
????
if
(NULL?
==
?(g_pD3D?
=
?Direct3DCreate9(D3D_SDK_VERSION)))
161
????
{
162
????????D3DErr(
"
無法創(chuàng)建Direct3D9設(shè)備
"
);
163
????????
return
?E_FAIL;
164
????}
165
????
//
?獲取當(dāng)前顯示模式
166
????D3DDISPLAYMODE?d3ddm;
167
????
if
(FAILED(g_pD3D
->
GetAdapterDisplayMode(D3DADAPTER_DEFAULT?,?
&
d3ddm)))
168
????
{
169
????????D3DErr(
"
無法獲取D3D顯示器模式
"
);
170
????????
return
?E_FAIL;
171
????}
172
173
????
//
?獲取窗口的大小
174
????RECT?rect;
175
????GetClientRect(hWnd?,?
&
rect);
176
177
????
//
?填充參數(shù)
178
????D3DPRESENT_PARAMETERS?d3dpp;
179
????memset(
&
d3dpp?,?
0
?,?
sizeof
(d3dpp));
180
????d3dpp.BackBufferFormat?
=
?d3ddm.Format;
181
????d3dpp.BackBufferWidth?
=
?rect.right?
-
?rect.left;
182
????d3dpp.BackBufferHeight?
=
?rect.bottom?
-
?rect.top;
183
????d3dpp.SwapEffect?
=
?D3DSWAPEFFECT_DISCARD;
184
????d3dpp.Windowed?
=
?
true
;
185
????d3dpp.AutoDepthStencilFormat?
=
?D3DFMT_D16;
186
????d3dpp.EnableAutoDepthStencil?
=
?TRUE;
187
188
????
//
?獲取帽子
189
????
if
(FAILED(g_pD3D
->
GetDeviceCaps(D3DADAPTER_DEFAULT?,?D3DDEVTYPE_HAL?,?
&
g_Caps)))
190
????
{
191
????????D3DErr(
"
獲取D3D?帽子時(shí)發(fā)生錯(cuò)誤
"
);
192
????????
return
?E_FAIL;
193
????}
194
195
????
//
?創(chuàng)建D3D設(shè)備
196
????
if
(FAILED(g_pD3D
->
CreateDevice(D3DADAPTER_DEFAULT
197
????????,?D3DDEVTYPE_HAL
198
????????,?hWnd
199
????????
//
?檢查是否支持硬件頂點(diǎn)處理
200
????????,?g_Caps.DevCaps?
&
?D3DDEVCAPS_HWTRANSFORMANDLIGHT?
?
?D3DCREATE_HARDWARE_VERTEXPROCESSING?:?D3DCREATE_SOFTWARE_VERTEXPROCESSING
201
????????,?
&
d3dpp
202
????????,?
&
g_pd3dDevice
203
????????)
204
????????))
205
????
{
206
????????D3DErr(
"
創(chuàng)建D3D設(shè)備時(shí)發(fā)生錯(cuò)誤
"
);
207
????????
return
?E_FAIL;
208
????}
209
????g_pd3dDevice
->
SetRenderState(?D3DRS_CULLMODE,?D3DCULL_NONE?);
210
????g_pd3dDevice
->
SetRenderState(?D3DRS_ZENABLE,?TRUE?);
211
212
????
if
(FAILED(InitGeometry()))
213
????????
return
?E_FAIL;
214
????
return
?S_OK;
215
}
216
217
//
?清空所有占用的資源
218
void
?CleanUp()
219
{
220
????SAFE_RELEASE(g_pTexture);
221
????SAFE_RELEASE(g_pIB);
222
????SAFE_RELEASE(g_pVB);
223
????SAFE_RELEASE(g_pd3dDevice);
224
????SAFE_RELEASE(g_pD3D);
225
}
226
227
228
//
?消息處理
229
LRESULT?WINAPI?MsgProc(HWND?hWnd?,?UINT?message?,?WPARAM?wParam?,?LPARAM?lParam)
230
{
231
????
switch
(message)
232
????
{
233
????
case
?WM_DESTROY:
234
????????CleanUp();
235
????????PostQuitMessage(
0
);
236
????????
break
;
237
????}
238
????
return
?::DefWindowProc(hWnd,?message?,?wParam?,?lParam);
239
}
240
241
//
?Windows?入口
242
int
?WINAPI?WinMain(IN?HINSTANCE?hInstance,?IN?HINSTANCE?hPrevInstance,?IN?LPSTR?lpCmdLine,?IN?
int
?nShowCmd?)
243
{
244
????WNDCLASS?wndClass;
245
????memset(
&
wndClass?,?
0
?,?
sizeof
(wndClass));
246
????wndClass.hInstance?
=
?hInstance;
247
????wndClass.lpszClassName?
=
?
"
Tutorial02
"
;
248
????wndClass.lpfnWndProc?
=
?MsgProc;
249
????RegisterClass(
&
wndClass);
250
251
????
//
?創(chuàng)建窗口
252
????HWND?hWnd?
=
?CreateWindow(
"
Tutorial02
"
?,?
"
Tutorial02?Texture?Scrolling
"
?
253
????????,?WS_OVERLAPPEDWINDOW?,?
0
?,?
0
?,?
512
?,
512
?,?GetDesktopWindow()
254
????????,?
0
?,?wndClass.hInstance?,?
0
);
255
????
//
?顯示窗口
256
????ShowWindow(hWnd?,?SW_SHOWDEFAULT);
257
????UpdateWindow(hWnd);
258
259
????
//
?初始化?D3D?設(shè)備
260
????
if
(SUCCEEDED(InitD3D(hWnd)))
261
????
{
262
????????
//
?消息處理循環(huán)
263
????????MSG?msg;
264
????????memset(
&
msg?,?
0
?,?
sizeof
(msg));
265
????????
while
(msg.message?
!=
?WM_QUIT)
266
????????
{
267
????????????
if
(PeekMessage(
&
msg?,?
0
?,?
0
?,?
0
?,?PM_REMOVE))
268
????????????
{
269
????????????????TranslateMessage(
&
msg);
270
????????????????DispatchMessage(
&
msg);
271
????????????}
272
????????????
else
273
????????????
{
274
????????????????Render();
275
????????????}
276
????????}
277
????}
278
????
//
?清空場景
279
????CleanUp();
280
281
????UnregisterClass(
"
Tutorial02
"
?,?wndClass.hInstance);
282
283
????
return
?
0
;
284
}

??2

??3

??4

??5

??6

??7

??8

??9



?10

?11

?12

?13

?14

?15

?16

?17



?18

?19

?20

?21

?22

?23

?24

?25



?26

?27

?28

?29

?30

?31



?32

?33

?34

?35

?36

?37

?38

?39



?40

?41

?42

?43

?44

?45

?46

?47

?48

?49

?50

?51

?52

?53

?54

?55

?56

?57

?58

?59

?60

?61

?62

?63

?64



?65

?66

?67

?68

?69

?70



?71

?72

?73

?74

?75

?76

?77

?78

?79



?80

?81

?82

?83

?84

?85

?86

?87

?88



?89

?90

?91

?92

?93

?94

?95

?96

?97

?98

?99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127



128

129



130

131

132

133

134



135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158



159

160

161



162

163

164

165

166

167

168



169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

186

187

188

189

190



191

192

193

194

195

196

197

198

199

200

201

202

203

204

205



206

207

208

209

210

211

212

213

214

215

216

217

218

219



220

221

222

223

224

225

226

227

228

229

230



231

232



233

234

235

236

237

238

239

240

241

242

243



244

245

246

247

248

249

250

251

252

253

254

255

256

257

258

259

260

261



262

263

264

265

266



267

268



269

270

271

272

273



274

275

276

277

278

279

280

281

282

283

284
