#include <d3d9.h>
#define SAFE_RELEASE(p) {if(p){(p)->Release();(p)=NULL;}}
wchar_t *g_pclassname =L"vertex";//窗口类名
wchar_t *g_pwindowsname =L"顶点";//标题
LPDIRECT3DDEVICE9 g_pd3ddevice =NULL;
LPDIRECT3DVERTEXBUFFER9 g_pvertexbuf =NULL;
struct CUSTOMVERTEX
{
FLOAT _x,_y,_z,_rhw;
DWORD _color;
CUSTOMVERTEX(FLOAT x,FLOAT y ,FLOAT z,FLOAT rhw,DWORD color):_x(x),_y(y),_z(z),_rhw(rhw),_color(color){}
};
#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZRHW | D3DFVF_DIFFUSE)
HRESULT initdirectinit(HWND hwnd);//初始化
VOID directrender();//渲染
VOID directcleaup();//清理
LRESULT CALLBACK wndproc(HWND ,UINT,WPARAM,LPARAM);
int WINAPI WinMain( HINSTANCE hInstance,HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd )
{
WNDCLASS wndclass;
wndclass.cbClsExtra =0;
wndclass.cbWndExtra =0;
wndclass.hbrBackground =(HBRUSH)GetStockObject(WHITE_BRUSH);
wndclass.hCursor =LoadCursor(NULL,IDC_ARROW);
wndclass.hIcon =LoadIcon(NULL,IDI_APPLICATION);
wndclass.hInstance =hInstance;
wndclass.lpfnWndProc =wndproc;
wndclass.lpszClassName =g_pclassname;
wndclass.lpszMenuName =NULL;
wndclass.style =CS_HREDRAW |CS_VREDRAW;
if(!RegisterClass(&wndclass))
return 0;
HWND hwnd =CreateWindow(g_pclassname,g_pwindowsname,WS_OVERLAPPEDWINDOW,0,0,400,400,NULL,NULL,hInstance,NULL);
initdirectinit(hwnd);
ShowWindow(hwnd,SW_SHOWDEFAULT);
UpdateWindow(hwnd);
//消息循环
MSG msg;
ZeroMemory (&msg,sizeof(msg));
while(msg.message!=WM_QUIT)
{
if(PeekMessage(&msg,NULL,NULL,NULL,PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
{
directrender();
}
}
UnregisterClass (g_pwindowsname,wndclass.hInstance);
return 0;
}
LRESULT CALLBACK wndproc(HWND hwnd ,UINT message,WPARAM wparam,LPARAM lparam)
{
switch (message)
{
case WM_PAINT:
directrender();
ValidateRect(hwnd,NULL);
break;
case WM_KEYDOWN:
if(wparam==VK_ESCAPE)
DestroyWindow(hwnd);
break;
case WM_DESTROY:
directcleaup();
PostQuitMessage(NULL);
break;
}
return DefWindowProc(hwnd,message,wparam,lparam);
}
HRESULT initdirectinit(HWND hwnd)
{
LPDIRECT3D9 pd3d =NULL;
pd3d =Direct3DCreate9(D3D_SDK_VERSION);
if(pd3d==NULL) return S_FALSE;
D3DCAPS9 caps;int vp =0;
pd3d ->GetDeviceCaps(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,&caps);
if(caps.DevCaps &D3DDEVCAPS_HWTRANSFORMANDLIGHT )
vp=D3DCREATE_HARDWARE_VERTEXPROCESSING;
else
vp=D3DCREATE_SOFTWARE_VERTEXPROCESSING;
D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory (&d3dpp,sizeof(d3dpp));
d3dpp.BackBufferHeight =500;
d3dpp.BackBufferWidth =500;
d3dpp.BackBufferFormat =D3DFMT_A8R8G8B8;
d3dpp.BackBufferCount =1;
d3dpp.MultiSampleType =D3DMULTISAMPLE_NONE;
d3dpp.MultiSampleQuality =0;
d3dpp.SwapEffect =D3DSWAPEFFECT_DISCARD;
d3dpp.hDeviceWindow =hwnd;
d3dpp.Windowed =true;
d3dpp.EnableAutoDepthStencil =true;
d3dpp.AutoDepthStencilFormat =D3DFMT_D24S8;
d3dpp.Flags =0;
d3dpp.FullScreen_RefreshRateInHz =D3DPRESENT_RATE_DEFAULT;
d3dpp.PresentationInterval =D3DPRESENT_INTERVAL_IMMEDIATE;
pd3d->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hwnd,vp,&d3dpp,&g_pd3ddevice);
pd3d->Release();
//创建顶点
g_pd3ddevice->CreateVertexBuffer(6*sizeof(CUSTOMVERTEX),0,D3DFVF_CUSTOMVERTEX,D3DPOOL_DEFAULT,&g_pvertexbuf,NULL);
CUSTOMVERTEX *pvertices=NULL;
g_pvertexbuf ->Lock(0,0,(void**)&pvertices,0);
pvertices[0] =CUSTOMVERTEX(220.0f,120.0f,0.5f,1.0f,D3DCOLOR_XRGB(255,255,255));
pvertices[1] =CUSTOMVERTEX(420.0f,120.0f,0.5f,1.0f,D3DCOLOR_XRGB(0,255,0));
pvertices[2] =CUSTOMVERTEX(220.0f,320.0f,0.5f,1.0f,D3DCOLOR_XRGB(255,255,0));
pvertices[3]=CUSTOMVERTEX(420.0f,120.0f,0.5f,1.0f,D3DCOLOR_XRGB(0,255,255));
pvertices[4]=CUSTOMVERTEX(420.0f,320.0f,0.5f,1.0f,D3DCOLOR_XRGB(0,255,255));
pvertices[5]=CUSTOMVERTEX(220.0f,220.0f,0.5f,1.0f,D3DCOLOR_XRGB(255,255,0));
g_pvertexbuf->Unlock();
return S_OK;
}
//渲染
VOID directrender()
{
g_pd3ddevice->Clear(0,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(45,50,170),1.0f,0);
g_pd3ddevice->BeginScene();
g_pd3ddevice->SetStreamSource(0,g_pvertexbuf,0,sizeof(CUSTOMVERTEX));
g_pd3ddevice->SetFVF(D3DFVF_CUSTOMVERTEX);
g_pd3ddevice->DrawPrimitive(D3DPT_TRIANGLELIST,0,2);
g_pd3ddevice->EndScene();
g_pd3ddevice->Present(NULL,NULL,NULL,NULL);
}
VOID directcleaup()
{
SAFE_RELEASE(g_pvertexbuf);
SAFE_RELEASE(g_pd3ddevice);
#define SAFE_RELEASE(p) {if(p){(p)->Release();(p)=NULL;}}
wchar_t *g_pclassname =L"vertex";//窗口类名
wchar_t *g_pwindowsname =L"顶点";//标题
LPDIRECT3DDEVICE9 g_pd3ddevice =NULL;
LPDIRECT3DVERTEXBUFFER9 g_pvertexbuf =NULL;
struct CUSTOMVERTEX
{
FLOAT _x,_y,_z,_rhw;
DWORD _color;
CUSTOMVERTEX(FLOAT x,FLOAT y ,FLOAT z,FLOAT rhw,DWORD color):_x(x),_y(y),_z(z),_rhw(rhw),_color(color){}
};
#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZRHW | D3DFVF_DIFFUSE)
HRESULT initdirectinit(HWND hwnd);//初始化
VOID directrender();//渲染
VOID directcleaup();//清理
LRESULT CALLBACK wndproc(HWND ,UINT,WPARAM,LPARAM);
int WINAPI WinMain( HINSTANCE hInstance,HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd )
{
WNDCLASS wndclass;
wndclass.cbClsExtra =0;
wndclass.cbWndExtra =0;
wndclass.hbrBackground =(HBRUSH)GetStockObject(WHITE_BRUSH);
wndclass.hCursor =LoadCursor(NULL,IDC_ARROW);
wndclass.hIcon =LoadIcon(NULL,IDI_APPLICATION);
wndclass.hInstance =hInstance;
wndclass.lpfnWndProc =wndproc;
wndclass.lpszClassName =g_pclassname;
wndclass.lpszMenuName =NULL;
wndclass.style =CS_HREDRAW |CS_VREDRAW;
if(!RegisterClass(&wndclass))
return 0;
HWND hwnd =CreateWindow(g_pclassname,g_pwindowsname,WS_OVERLAPPEDWINDOW,0,0,400,400,NULL,NULL,hInstance,NULL);
initdirectinit(hwnd);
ShowWindow(hwnd,SW_SHOWDEFAULT);
UpdateWindow(hwnd);
//消息循环
MSG msg;
ZeroMemory (&msg,sizeof(msg));
while(msg.message!=WM_QUIT)
{
if(PeekMessage(&msg,NULL,NULL,NULL,PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
{
directrender();
}
}
UnregisterClass (g_pwindowsname,wndclass.hInstance);
return 0;
}
LRESULT CALLBACK wndproc(HWND hwnd ,UINT message,WPARAM wparam,LPARAM lparam)
{
switch (message)
{
case WM_PAINT:
directrender();
ValidateRect(hwnd,NULL);
break;
case WM_KEYDOWN:
if(wparam==VK_ESCAPE)
DestroyWindow(hwnd);
break;
case WM_DESTROY:
directcleaup();
PostQuitMessage(NULL);
break;
}
return DefWindowProc(hwnd,message,wparam,lparam);
}
HRESULT initdirectinit(HWND hwnd)
{
LPDIRECT3D9 pd3d =NULL;
pd3d =Direct3DCreate9(D3D_SDK_VERSION);
if(pd3d==NULL) return S_FALSE;
D3DCAPS9 caps;int vp =0;
pd3d ->GetDeviceCaps(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,&caps);
if(caps.DevCaps &D3DDEVCAPS_HWTRANSFORMANDLIGHT )
vp=D3DCREATE_HARDWARE_VERTEXPROCESSING;
else
vp=D3DCREATE_SOFTWARE_VERTEXPROCESSING;
D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory (&d3dpp,sizeof(d3dpp));
d3dpp.BackBufferHeight =500;
d3dpp.BackBufferWidth =500;
d3dpp.BackBufferFormat =D3DFMT_A8R8G8B8;
d3dpp.BackBufferCount =1;
d3dpp.MultiSampleType =D3DMULTISAMPLE_NONE;
d3dpp.MultiSampleQuality =0;
d3dpp.SwapEffect =D3DSWAPEFFECT_DISCARD;
d3dpp.hDeviceWindow =hwnd;
d3dpp.Windowed =true;
d3dpp.EnableAutoDepthStencil =true;
d3dpp.AutoDepthStencilFormat =D3DFMT_D24S8;
d3dpp.Flags =0;
d3dpp.FullScreen_RefreshRateInHz =D3DPRESENT_RATE_DEFAULT;
d3dpp.PresentationInterval =D3DPRESENT_INTERVAL_IMMEDIATE;
pd3d->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hwnd,vp,&d3dpp,&g_pd3ddevice);
pd3d->Release();
//创建顶点
g_pd3ddevice->CreateVertexBuffer(6*sizeof(CUSTOMVERTEX),0,D3DFVF_CUSTOMVERTEX,D3DPOOL_DEFAULT,&g_pvertexbuf,NULL);
CUSTOMVERTEX *pvertices=NULL;
g_pvertexbuf ->Lock(0,0,(void**)&pvertices,0);
pvertices[0] =CUSTOMVERTEX(220.0f,120.0f,0.5f,1.0f,D3DCOLOR_XRGB(255,255,255));
pvertices[1] =CUSTOMVERTEX(420.0f,120.0f,0.5f,1.0f,D3DCOLOR_XRGB(0,255,0));
pvertices[2] =CUSTOMVERTEX(220.0f,320.0f,0.5f,1.0f,D3DCOLOR_XRGB(255,255,0));
pvertices[3]=CUSTOMVERTEX(420.0f,120.0f,0.5f,1.0f,D3DCOLOR_XRGB(0,255,255));
pvertices[4]=CUSTOMVERTEX(420.0f,320.0f,0.5f,1.0f,D3DCOLOR_XRGB(0,255,255));
pvertices[5]=CUSTOMVERTEX(220.0f,220.0f,0.5f,1.0f,D3DCOLOR_XRGB(255,255,0));
g_pvertexbuf->Unlock();
return S_OK;
}
//渲染
VOID directrender()
{
g_pd3ddevice->Clear(0,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(45,50,170),1.0f,0);
g_pd3ddevice->BeginScene();
g_pd3ddevice->SetStreamSource(0,g_pvertexbuf,0,sizeof(CUSTOMVERTEX));
g_pd3ddevice->SetFVF(D3DFVF_CUSTOMVERTEX);
g_pd3ddevice->DrawPrimitive(D3DPT_TRIANGLELIST,0,2);
g_pd3ddevice->EndScene();
g_pd3ddevice->Present(NULL,NULL,NULL,NULL);
}
VOID directcleaup()
{
SAFE_RELEASE(g_pvertexbuf);
SAFE_RELEASE(g_pd3ddevice);
}