direct3D——硬件结构

#include <d3d9.h>


#define SAFE_RELESE(p) {if(p){(p)->Release(); (p)=NULL;}}


wchar_t *g_classname  =L"hellowdirect3D";
wchar_t *g_windowname =L"direct3D";


LPDIRECT3DDEVICE9 g_pd3ddevice =NULL;//设备接口


HRESULT initdirect(HWND hwnd);//初始化direct
VOID    direct3Drender();//渲染图形
VOID    direct3Dcleanup();//清理资源


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(BLACK_BRUSH);//背景颜色
wndclass.hCursor               =LoadCursor(NULL,IDC_ARROW);//光标
wndclass.hIcon                 =LoadCursor(NULL,IDI_APPLICATION);//小图标
wndclass.hInstance             =hInstance;
wndclass.lpfnWndProc           =wndproc;
wndclass.lpszClassName         =g_classname;
wndclass.lpszMenuName          =NULL;
wndclass.style                 =CS_HREDRAW|CS_VREDRAW;


//注册窗口
if(!RegisterClass(&wndclass))
return 0;
//创建窗口
HWND hwnd=CreateWindow(g_classname,g_windowname,WS_OVERLAPPEDWINDOW,200,200,400,600,NULL,NULL,hInstance,NULL);
//初始化direct
initdirect(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_classname,wndclass.hInstance);
}
return 0;
}


LRESULT CALLBACK wndproc(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)   //按下esc键
DestroyWindow(hwnd);
break;
case WM_DESTROY:
direct3Dcleanup();//清理direct
PostQuitMessage(0);//退出程序
break;
}


return DefWindowProc(hwnd,message,wparam,lparam);
}


//初始化direct
HRESULT initdirect(HWND hwnd)
{
LPDIRECT3D9   pd3d=NULL;
pd3d  =Direct3DCreate9(D3D_SDK_VERSION);
if(pd3d==NULL)  return S_FALSE;


//获取硬件设备
D3DCAPS9    caps;  int v=0;
pd3d->GetDeviceCaps(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,&caps);
if(caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT)
v=D3DCREATE_HARDWARE_VERTEXPROCESSING;
else
v=D3DCREATE_SOFTWARE_VERTEXPROCESSING;


创建direct设备接口
D3DPRESENT_PARAMETERS d3dpp; 
ZeroMemory(&d3dpp, sizeof(d3dpp));
d3dpp.BackBufferWidth            = 640;
d3dpp.BackBufferHeight           = 480;
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,v,&d3dpp,&g_pd3ddevice);


pd3d->Release();
return S_OK;
}


//渲染图形
VOID direct3Drender()
{
g_pd3ddevice->Clear(0,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(80,90,120),1.0f,0);

//开始绘制
g_pd3ddevice->BeginScene();
//先不绘制图形
g_pd3ddevice->EndScene();//结束绘制
g_pd3ddevice->Present(NULL,NULL,NULL,NULL);//翻转


}


//清理资源
VOID direct3Dcleanup()
{
if(g_pd3ddevice!=NULL)
g_pd3ddevice->Release();
g_pd3ddevice=NULL;
SAFE_RELESE(g_pd3ddevice);

}






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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值