D3D入门---基本构架篇
当自己是白痴啦,从初心者复习D3D
前备工作。 1:全局变量:D3D指针和D3D设备指针。 LPDIRECT3D9 m_pD3D = NULL; LPDIRECT3DDEVICE9 m_pD3DDevice = NULL; 2:顶点结构声明。顶点数据。 #define D3DVertexFVF (D3DFVF_XYZ | D3DFVF_DIFFUSE) struct tagVertex{FLOAT fX, fY, fZ; DWORD dwColor;}; tagVertex VertexData[XX] = {{X,Y,Z,D3DCOLOR_XRGP(X,X,X)}, … }; 3:WinMain入口。
int WINAPI WinMain( ... )
{
// 注册一个窗口类
WNDCLASSEX windowClass;
windowClass.XXXX = XXXX;
....
RegisterClassEx(&windowClass);
// 创建一个窗口
hWnd = CreateWindowEx(....);
if (!hWnd) return 0;
// 显示更新窗口
ShowWindow(hWnd, SW_SHOW);
UpdateWindow(hWnd);
// 初始化D3D
if (!InitD3D(hWnd)) return ;
// 消息循环
bool bQuit = false;
while(true)
{
if (PeekMessage(....))
{
if (WM_QUIT == uMag.message)
{
bQuit = true;
}
// 消息处理分发
TranslateMessage(&uMsg);
DispatchMessage(&uMag);
if (bQuit) break;
}
else
{
// 无键盘消息时进行渲染
Reander();
}
}
// 关闭3D设备
ShutdownD3DDevice();
// 为OS释放WindowClass的注册
UnregisterClass(xxx);
return (int)uMsg.wParam;
}
4:上文中一些自定义函数的实现。
//=================
// 消息回调函数
//=================
LRESULT CALLBACK WndProc( xxx, .... )
{
switch(message)
{
case WM_KEYUP:
if(VK_ESCAPE == wParam) PostQuitMessage(0); return ;
case WM_CLOSE: ....
default : break;
}
return DefWindowProc( .... );
}
//=================
// 初始化D3D设备环境
//=================
bool InitD3D(HWND hWnd)
{
// 创建D3D对象
m_pD3D = Direct3DCreate9(D3D_SDK_VERSION);
if (!m_pD3D) return false;
// 获取D3D设备模式
D3DDISPLAYMODE tagDisplayMode;
if ((m_pD3D->GetAdapterDisplayMode(D3DADAPTDER_DEFAULT, &tagDisplayMode)) != S_OK)
return false;
// 获取硬件模式
D3DCAPS9 D3DCaps;
if ((m_pD3D->GetDeviceCaps(D3DADPTER_DEFAULT, D3DEVTYPE_HAL, &D3DCaps)) != S_OK)
return false;
// 设置D3D设备模式参数
D3DPRESENT_PARAMETERS tagPreParam;
ZeroMemory(&tagPreParam, sizeof(tagPreParam));
tagPreParam.XXX = XXX;
....
// 创建D3D设备
if (m_pD3D->CreateDevice( xxxx , &tagPreParam, &m_pD3DDevice)) return false;
// 设置一些全局渲染模式
m_pD3DDevice->SetRenderState(XXX, XXX);
}
//=================
// 渲染
//=================
void Render()
{
// 清空前台缓冲
m_pD3DDevice->Clear(xxx, xxx, ... );
// 开始D3D绘制
m_pD3DDevice->BeginScene();
// 创建一个适合大小的顶点缓冲区
LPDIRECT3DVERTECBUFFER9 pVertexBuf;
if (FAILED(m_pD3DDevice->CreateVertexBuffer(xxx, xxx, &pVertecBuf, ...))) return;
// 为顶点缓冲区填充顶点信息
pVertexBuf->Lock( ... );
memcpy(pVertexBuf, VertexData, sizeof(VertexData));
pVertexBuf->Unlock();
// 设置顶点流和灵活格式
m_pD3DDevice->SetStreamSource( ... );
m_pD3DDevice->SetFVF( D3DVertexFVF );
// 开始绘制
m_pD3DDevice->Draw();
// 绘制完毕,释放资源
pVertexBuf->Release();
m_pD3DDevice->EndScene();
// 前后台缓冲区更换显示
m_pD3DDevice->Present(NULL, NULL, NULL, NULL);
}
//=================
// 关闭释放D3D设备资源
//=================
void ShutdownD3DDevice()
{
SAFERELEASE(m_pD3DDevice);
SAFERELEASE(m_pD3D);
}