#include<d3d9.h>LPDIRECT3D9 g_pD3D=NULL;
LPDIRECT3DDEVICE9 g_pD3DDevice=NULL;
LPDIRECT3DVERTEXBUFFER9 g_pVertexBuffer=NULL;struct CUSTOMVERTEX
{
FLOAT x,y,z,rhw;
DWORD colour;
};#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZRHW|D3DFVF_DIFFUSE)
#define SafeRelease(pObject) if(pObject!=NULL){pObject->Release();pObject=NULL;}HRESULT InitialiseD3D(HWND hWnd)
{
//初始化D3D接口
g_pD3D=Direct3DCreate9(D3D_SDK_VERSION);
if(g_pD3D==NULL)
{
return E_FAIL;
}
//获取显示卡显示模式
D3DDISPLAYMODE d3ddm;
if(FAILED(g_pD3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT,&d3ddm)))
{
return E_FAIL;
}
//创建显示结构
D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory(&d3dpp,sizeof(d3dpp)); //填充结构
d3dpp.Windowed=TRUE;
d3dpp.SwapEffect=D3DSWAPEFFECT_DISCARD;
d3dpp.BackBufferFormat=d3ddm.Format;
//创建3D设备指针
if(FAILED(g_pD3D->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hWnd,D3DCREATE_SOFTWARE_VERTEXPROCESSING,&d3dpp,&g_pD3DDevice)))
{
return E_FAIL;
}
return S_OK;
}HRESULT InitialiseVertexBuffer()
{
VOID*pVertices;
//设置顶点位置,颜色信息
CUSTOMVERTEX cvVertices[]=
{
{250.0f,100.0f,0.5f,1.0f,D3DCOLOR_XRGB(255,0,0),},
{400.0f,350.0f,0.5f,1.0f,D3DCOLOR_XRGB(0,255,0),},
{100.0f,350.0f,0.5f,1.0f,D3DCOLOR_XRGB(0,0,255),},
};
//创建顶点缓冲
if(FAILED(g_pD3DDevice->CreateVertexBuffer(
3*sizeof(CUSTOMVERTEX),0,D3DFVF_CUSTOMVERTEX,D3DPOOL_DEFAULT,&g_pVertexBuffer,NULL)))
{
return E_FAIL;
}
//锁定顶点缓冲
if(FAILED(g_pVertexBuffer->Lock(0,sizeof(cvVertices),(void**)&pVertices,0)))
{
return E_FAIL;
}
//拷贝顶点信息
memcpy(pVertices,cvVertices,sizeof(cvVertices));
//解锁
g_pVertexBuffer->Unlock();
return S_OK;
}void Render()
{
if(g_pD3DDevice==NULL)
{
return;
}
//清空3D设备
g_pD3DDevice->Clear(0,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(255,255,255),1.0f,0);
//开始绘制
g_pD3DDevice->SetStreamSource(0,g_pVertexBuffer,0,sizeof(CUSTOMVERTEX));
g_pD3DDevice->SetFVF(D3DFVF_CUSTOMVERTEX);
g_pD3DDevice->DrawPrimitive(D3DPT_TRIANGLELIST,0,1);
//结束
g_pD3DDevice->EndScene();
//翻转
g_pD3DDevice->Present(NULL,NULL,NULL,NULL);
}
//释放建立的对象
void CleanUp()
{
SafeRelease(g_pVertexBuffer);
SafeRelease(g_pD3DDevice);
SafeRelease(g_pD3D);
}void GameLoop()
{
MSG msg;
BOOL fMessage;
PeekMessage(&msg,NULL,0U,0U,PM_NOREMOVE);
while(msg.message!=WM_QUIT)
{
fMessage=PeekMessage(&msg,NULL,0U,0U,PM_REMOVE);
if(fMessage)
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
{
Render();
}
}
}
//windows消息处理
LRESULT WINAPI WinProc(HWND hWnd,
UINT msg,
WPARAM wParam,
LPARAM lParam)
{
switch(msg)
{
case WM_DESTROY:
PostQuitMessage(0);
return 0;
break;
case WM_KEYUP:
switch(wParam)
{
case VK_ESCAPE:
DestroyWindow(hWnd);
return 0;
break;
}
break;
}
return DefWindowProc(hWnd,msg,wParam,lParam);
}////////////////WINMAIN////////////////////////////////////////////////
INT WINAPI WinMain(HINSTANCE hInst,HINSTANCE,LPSTR,INT)
{
WNDCLASSEX wc={sizeof(WNDCLASSEX),CS_CLASSDC,WinProc,0L,0L,GetModuleHandle(NULL),NULL,NULL,NULL,NULL,"base",NULL};
RegisterClassEx(&wc); HWND hWnd=CreateWindow("base","Direct基础",
WS_OVERLAPPEDWINDOW,50,50,500,500,
GetDesktopWindow(),NULL,wc.hInstance,,NULL);
if(SUCCEEDED(InitialiseD3D(hWnd)))
{
ShowWindow(hWnd,SW_SHOWDEFAULT);
UpdateWindow(hWnd);
if(SUCCEEDED(InitialiseVertexBuffer()))
{
GameLoop();
}
}
CleanUp();
UnregisterClass("base",wc.hInstance);
return 0;
}
//错误如下
--------------------Configuration: D3D9 - Win32 Debug--------------------
Linking...
D3D9.OBJ : error LNK2001: unresolved external symbol _Direct3DCreate9@4
Debug/D3D9.exe : fatal error LNK1120: 1 unresolved externals
Error executing link.exe.D3D9.exe - 2 error(s), 0 warning(s)
//要绘制一个三角形