direct3d顶点

#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);

}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值