direct填充

#include <d3d9.h>
#define SAFE_RELEASE(p) {if(p) {(p)->Release(); (p)=NULL;}}


wchar_t *g_pclassname =L"file";//窗口类名
wchar_t *g_windowname =L"填充,按下QWE";//标题名


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 initdirect3d(HWND hwnd);   //direct初始化
VOID direct3drender();             //渲染
VOID direct3dclenup();             //清理资源


LRESULT CALLBACK wndporc(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(BLACK_BRUSH);
wndclass.hCursor              =LoadCursor(NULL,IDC_ARROW);
wndclass.hIcon                =LoadCursor(NULL,IDI_APPLICATION);
wndclass.hInstance            =hInstance;
wndclass.lpfnWndProc          =wndporc;
wndclass.lpszClassName        =g_pclassname;
wndclass.lpszMenuName         =NULL;
wndclass.style                =CS_VREDRAW|CS_HREDRAW;


//注册窗口
if(!RegisterClass(&wndclass))
return 0;


//创建窗口
HWND hwnd=CreateWindow(g_pclassname,g_windowname,WS_OVERLAPPEDWINDOW,100,100,400,600,NULL,NULL,hInstance,NULL);


initdirect3d(hwnd);



ShowWindow(hwnd ,SW_SHOWDEFAULT);
UpdateWindow(hwnd);


//消息循环
MSG msg;
ZeroMemory(&msg,sizeof(msg));
while(msg.message!=WM_QUIT)
{
if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
{
direct3drender();
}
}
UnregisterClass (g_pclassname ,hInstance);
return 0;
}


LRESULT CALLBACK wndporc(HWND hwnd,UINT message,WPARAM wparam,LPARAM lparam)
{
switch(message)
{
case WM_PAINT:
direct3drender();
ValidateRect(hwnd,NULL);
break;
case WM_KEYDOWN:
if(wparam==VK_ESCAPE)
DestroyWindow(hwnd);
break;
case WM_DESTROY:
direct3dclenup();
DestroyWindow(0);
break;
}
return DefWindowProc(hwnd,message,wparam,lparam);
}


HRESULT initdirect3d(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            =640;
d3dpp.BackBufferWidth             =680;
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,0,0));
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,0));
pvertices[4] =CUSTOMVERTEX(420.0f,120.0f,0.5f,1.0f,D3DCOLOR_XRGB(0,0,255));
pvertices[5] =CUSTOMVERTEX(220.0f,320.0f,0.5f,1.0f,D3DCOLOR_XRGB(255,255,0));
g_pvertexbuf->Unlock();
return S_OK;
}


VOID direct3drender()
{
g_pd3ddevice->Clear(0,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(45,50,170),1.0f,0);


g_pd3ddevice->BeginScene();//开始绘制
if(::GetAsyncKeyState('Q')&0x8000)
g_pd3ddevice->SetRenderState(D3DRS_FILLMODE,D3DFILL_POINT);
if(::GetAsyncKeyState('W')&0x8000)
g_pd3ddevice->SetRenderState(D3DRS_FILLMODE,D3DFILL_WIREFRAME);
if(::GetAsyncKeyState('E')&0x8000)
g_pd3ddevice->SetRenderState(D3DRS_FILLMODE,D3DFILL_SOLID);


//渲染正方形
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 direct3dclenup()
{
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、付费专栏及课程。

余额充值