玩家对输入内容的反映速度要求很高,一旦反映慢了就会影响视觉感受。
消息处之后直接调用Render()函数, 充分利用闲置CPU进行图形绘制。
while (msg.message != WM_QUIT)
{
if (PeekMessage(&msg, NULL, 0U, 0U, PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
Render();
}
使用FVF(自由顶点格式)绘制三角。其实格式就是D3D的顺序格式定义 struct CUSTOMVERTEX
{
FLOAT x, y, z, rhw;
DWORD color;
};
#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZRHW | D3DFVF_DIFFUSE)
如果把把顺序换位个回出现问题

struct CUSTOMVERTEX
{
FLOAT rhw, x, y, z;
DWORD color;
};
#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZRHW | D3DFVF_DIFFUSE)
1

/**//**-----------------------------------------------------------------------------2
* \brief 创建顶点缓冲3
* 文件: Vertices.cpp4
*5
* 说明: 下面讲解顶点渲染的内容。这里我们可以看到顶点缓冲(vertex buffer)的概念.6
* 所谓顶点缓冲是指储存顶点的D3D对象, 用户可以使用FVF(Flexible Vertex Format) 7
* 随意定义格式. 这里将要使用的顶点是完成变换和光源处理的顶点.8
* 9
*-----------------------------------------------------------------------------*/10
#include <d3d9.h>11
#pragma comment(lib, "d3d9.lib")12

13

14
LPDIRECT3D9 g_pD3D = NULL;15
LPDIRECT3DDEVICE9 g_pd3dDevice = NULL;16
LPDIRECT3DVERTEXBUFFER9 g_pVB = NULL;17

18
struct CUSTOMVERTEX19


{20
FLOAT x, y, z, rhw;21
DWORD color;22
};23

24
#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZRHW | D3DFVF_DIFFUSE)25

26
HRESULT InitD3D(HWND);27
HRESULT InitVB();28
void Cleanup();29
VOID Render();30
LRESULT WINAPI MsgProc(HWND, UINT, WPARAM, LPARAM);31

32

33

34
INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)35


{36

WNDCLASSEX wc =
{sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc, 0L, 0L,37
GetModuleHandle(NULL), NULL, NULL, NULL, NULL, "D3D Tutorial", NULL};38

39
RegisterClassEx(&wc);40
HWND hWnd = CreateWindow("D3D Tutorial", "D3D Tutorail 02: Vertices",41
WS_OVERLAPPEDWINDOW, 100, 100, 300, 300,42
GetDesktopWindow(), NULL, wc.hInstance, NULL);43

44
if (SUCCEEDED(InitD3D(hWnd)))45

{46
if (SUCCEEDED(InitVB()))47

{48
ShowWindow(hWnd, SW_SHOWDEFAULT);49
UpdateWindow(hWnd);50

51
MSG msg;52
ZeroMemory(&msg, sizeof(msg));53
while (msg.message != WM_QUIT)54

{55

/**//// 消息队列中有消息时,调用相应的处理过程56
if (PeekMessage(&msg, NULL, 0U, 0U, PM_REMOVE))57

{58
TranslateMessage(&msg);59
DispatchMessage(&msg);60
}61
else62

/**//// 如果没有需要处理的消息,调用Render()函数63
Render();64
}65
}66
}67
}68

69

70
HRESULT InitD3D(HWND hWnd)71


{72
if (NULL == (g_pD3D = Direct3DCreate9(D3D_SDK_VERSION)))73
return E_FAIL;74

75
D3DPRESENT_PARAMETERS d3dpp;76
ZeroMemory(&d3dpp, sizeof(d3dpp));77
d3dpp.Windowed = TRUE;78
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;79
d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;80

81
if (FAILED(g_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, 82
D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &g_pd3dDevice)))83
return E_FAIL;84

85
return S_OK;86
}87

88

89

/**//**-----------------------------------------------------------------------------90
* 创建顶点缓冲,设置顶点值.91
* 顶点缓冲就是基本包含顶点数据的存储器块.92
* 创建顶点缓冲之后,必须调用Lock()函数和Unlock()函数来定义指针 93
* 将顶点数据写入顶点缓冲.94
* D3D可以使用索引缓冲.95
* 基本系统存储器之外,顶点缓冲和索引缓冲也可以在设备存储器(显卡存储器)创建,96
* 不过,这种情况下,大部分显卡的速度会受到很大的影响.97
* 98
*------------------------------------------------------------------------------99
*/100
HRESULT InitVB()101


{102
CUSTOMVERTEX vertices[] = 103

{104

{ 150.0f, 50.0f, 0.5f, 1.0f, 0xffff0000,},105

{ 250.0f, 250.0f, 0.5f, 1.0f, 0xff00ff00,},106

{ 25.0f, 250.0f, 0.5f, 1.0f, 0xff00ffff,},107
};108

109
if (FAILED(g_pd3dDevice->CreateVertexBuffer(3*sizeof(CUSTOMVERTEX), 0, D3DFVF_CUSTOMVERTEX,110
D3DPOOL_DEFAULT, &g_pVB, NULL)))111
return E_FAIL;112
113
VOID* pVertices;114
if (FAILED(g_pVB->Lock(0, sizeof(vertices), (void**)&pVertices, 0)))115
return E_FAIL;116

117
memcpy(pVertices, vertices, sizeof(vertices));118
g_pVB->Unlock();119

120
return S_OK;121
122
}123

124
void Cleanup()125


{126
if (g_pVB != NULL)127
g_pVB->Release();128
if (g_pd3dDevice != NULL)129
g_pd3dDevice->Release();130
if (g_pD3D != NULL)131
g_pD3D->Release();132
}133

134
VOID Render()135


{136

/**//// 清除缓冲137
g_pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 1, 0);138
139
if (SUCCEEDED(g_pd3dDevice->BeginScene()))140

{141

/**//// 绘制顶点三角形142
/// 1、设置绘制缓冲数据数据流143
g_pd3dDevice->SetStreamSource(0, g_pVB, 0, sizeof(CUSTOMVERTEX));144

/**//// 2、设置缓冲格式145
g_pd3dDevice->SetFVF(D3DFVF_CUSTOMVERTEX);146

/**//// 3、147
g_pd3dDevice->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 1);148

149
g_pd3dDevice->EndScene();150
}151

152

/**//// 显示缓冲画面153
g_pd3dDevice->Present(NULL, NULL, NULL, NULL);154
}155

156
LRESULT WINAPI MsgProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)157


{158
switch(Msg)159

{160
case WM_DESTROY:161
Cleanup();162
PostQuitMessage(0);163
return 0;164
}165

166
return DefWindowProc(hWnd, Msg, wParam, lParam);167
}