#include <d3d9.h>
//创建全局对象
LPDIRECT3D9 g_pD3D = NULL;
LPDIRECT3DDEVICE9 g_pd3dDevice = NULL;
LPDIRECT3DVERTEXBUFFER9 g_pVB =NULL;
int g_iType=1;//图元类型
//定点结构
struct CUSTOMVERTEX
{
FLOAT x,y,z,rhw;
DWORD color;
};
#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZRHW|D3DFVF_DIFFUSE)
//初始化D3D
HRESULT Init3D(HWND hwnd)
{
if(NULL==(g_pD3D=Direct3DCreate9(D3D_SDK_VERSION)))
return E_FAIL;
D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory(&d3dpp,sizeof(d3dpp));
d3dpp.Windowed = TRUE;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;
if(FAILED(g_pD3D->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hwnd,D3DCREATE_SOFTWARE_VERTEXPROCESSING,&d3dpp,&g_pd3dDevice)))
{
return E_FAIL;
}
//设置剔除模式为不剔除任何面
g_pd3dDevice->SetRenderState(D3DRS_CULLMODE,D3DCULL_NONE);
//设置图元填充模式为线框模式
g_pd3dDevice->SetRenderState(D3DRS_FILLMODE,D3DFILL_WIREFRAME);
return S_OK;
}
//创建并填充顶点缓冲区
HRESULT InitVB()
{
CUSTOMVERTEX vertices[]={\
{ 50.0f,250.0f,0.5f,1.0f,0xffff0000, },\
{150.0f, 50.0f,0.5f,1.0f,0xffff0000, },\
{250.0f,250.0f,0.5f,1.0f,0xffff0000, },\
{350.0f, 50.0f,0.5f,1.0f,0xffff0000, },\
{450.0f,250.0f,0.5f,1.0f,0xffff0000, },\
{550.0f, 50.0f,0.5f,1.0f,0xffff0000, }\
};
if(FAILED(g_pd3dDevice->CreateVertexBuffer(6*sizeof(CUSTOMVERTEX),0,D3DFVF_CUSTOMVERTEX,D3DPOOL_DEFAULT,&g_pVB,NULL)))
return E_FAIL;
VOID *pVertices;
if(FAILED(g_pVB->Lock(0,sizeof(vertices),(void**)&pVertices,0)))
return E_FAIL;
memcpy(pVertices,vertices,sizeof(vertices));
g_pVB->Unlock();
return S_OK;
}
//释放创建的对象
VOID Cleanup()
{
if(g_pVB!=NULL)
g_pVB->Release();
if(g_pd3dDevice!=NULL)
g_pd3dDevice->Release();
if(g_pD3D!=NULL)
g_pD3D->Release();
}
//渲染对象
VOID Render()
{
//清空后台缓冲区
g_pd3dDevice->Clear(0,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(45,50,170),1.0f,0);
if(SUCCEEDED(g_pd3dDevice->BeginScene() ))
{
//在后台缓冲区绘制图形
g_pd3dDevice->SetStreamSource(0,g_pVB,0,sizeof(CUSTOMVERTEX));
g_pd3dDevice->SetFVF(D3DFVF_CUSTOMVERTEX);
switch(g_iType)
{
case 1://三角条带
//g_pd3dDevice->DrawPrimitive(D3DPT_TRIANGLELIST,0,4);//指定顶点渲染的序列孤立的三角形
g_pd3dDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP,0,4);//作为一个单一的顶点渲染折线
break;
case 2://三角形列表
g_pd3dDevice->DrawPrimitive(D3DPT_TRIANGLELIST,0,2);
break;
case 3://线段条带
g_pd3dDevice->DrawPrimitive(D3DPT_LINESTRIP,0,5);
break;
case 4://线段列表
g_pd3dDevice->DrawPrimitive(D3DPT_LINELIST,0,3);
break;
case 5://点列表
g_pd3dDevice->DrawPrimitive(D3DPT_POINTLIST,0,6);
break;
case 6://三角扇形
g_pd3dDevice->DrawPrimitive(D3DPT_TRIANGLEFAN,0,4);
break;
default:
break;
}
// g_pd3dDevice->DrawPrimitive(D3DPT_TRIANGLELIST,0,1);//三角形
g_pd3dDevice->EndScene();
}
g_pd3dDevice->Present(NULL,NULL,NULL,NULL);
}
//消息处理
LRESULT WINAPI MsgProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam)
{
switch(msg)
{
case WM_DESTROY:
Cleanup();
PostQuitMessage(0);//该函数向系统表明有个线程有终止请求。通常用来响应WM_DESTROY消息
return 0;
case WM_KEYDOWN:
switch(wParam)//设置渲染图元类型
{
case 49://1键
case 50://2键
case 51://3键
case 52://4键
case 53://5键
case 54://6键
g_iType=(int)wParam-48;//ASCII码转换
break;
}
}
return DefWindowProc(hwnd,msg,wParam,lParam);
}
int main(HINSTANCE hInst,HINSTANCE,LPSTR,INT)
{
//注册窗口类
WNDCLASSEX wc = {sizeof(WNDCLASSEX),CS_CLASSDC,MsgProc,0L,0L,GetModuleHandle(NULL),NULL,NULL,NULL,NULL,"ClassName",NULL};
RegisterClassEx( &wc );
//创建窗口
HWND hwnd=CreateWindow("ClassName","基本图元",WS_OVERLAPPEDWINDOW,100,100,600,300,NULL,NULL,wc.hInstance,NULL);
//初始化D3D
if(SUCCEEDED(Init3D(hwnd)))
{
if(SUCCEEDED(InitVB()))
{
//显示窗口
ShowWindow(hwnd,SW_SHOWDEFAULT);
UpdateWindow(hwnd);
//进入消息循环
MSG msg;
ZeroMemory(&msg,sizeof(msg));
while(msg.message!=WM_QUIT)
{
if(PeekMessage(&msg,NULL,0U,0U,PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
{
Render();//渲染图形
}
}
}
}
UnregisterClass("ClassName",wc.hInstance);
return 0;
}
VC做的简单图形dX例子
需积分: 10 165 浏览量
2011-04-06
13:59:01
上传
评论
收藏 2.02MB RAR 举报
只是空想家
- 粉丝: 28
- 资源: 2