您的位置:首页 > 其它

基于win32创建的direct3d程序

2012-11-03 19:53 106 查看
源代码:
#pragma comment(lib, "d3d9.lib")
#pragma comment(lib, "d3dx9.lib")
#include <d3d9.h>
#include <windows.h>
LPDIRECT3D9 g_pD3D=NULL;//direct3d对象
LPDIRECT3DDEVICE9 g_pd3dDevice=NULL;//direct3d设备对象
LPDIRECT3DVERTEXBUFFER9  g_pVertexBuffer=NULL;//点表
struct CUSTOMVERTEX
{
FLOAT X,Y,Z,rhw;
DWORD colour;
};
#define  D3DFVF_CUSTOMVERTEX (D3DFVF_XYZRHW|D3DFVF_DIFFUSE)
HRESULT InitD3D(HWND hWnd)
{
//创建direct3d对象,该对象用来创建direct3d设备对象
if (NULL==(g_pD3D=Direct3DCreate9(D3D_SDK_VERSION)))
return E_FAIL;
//设置d3dpresent_parameters结构,准备创建direct3d设备对象
D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory(&d3dpp,sizeof(d3dpp));
d3dpp.Windowed=TRUE;
d3dpp.SwapEffect=D3DSWAPEFFECT_DISCARD;
d3dpp.BackBufferFormat=D3DFMT_UNKNOWN;
//创建direct3d设备对象
if (FAILED(g_pD3D->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hWnd,D3DCREATE_SOFTWARE_VERTEXPROCESSING,&d3dpp,&g_pd3dDevice)))

return E_FAIL;
return S_OK;
}
HRESULT InitialiseVertexBuffer()
{
void *pVertices;
CUSTOMVERTEX cvVertices[]=
{
{250.0f,100.0f,0.5f,1.0f,D3DCOLOR_XRGB(255,0,0),

},
{
400.0f,350.0f,0.5f,1.0f,D3DCOLOR_XRGB(0,255,0),
},
{
100.0f,350.0f,0.5f,1.0f,D3DCOLOR_XRGB(0,0,255),
},
};
if(FAILED(g_pd3dDevice->CreateVertexBuffer(3*sizeof(CUSTOMVERTEX),0,D3DFVF_CUSTOMVERTEX,
D3DPOOL_DEFAULT,&g_pVertexBuffer,NULL)))
return E_FAIL;
if(FAILED(g_pVertexBuffer->Lock(0,sizeof(cvVertices),(void**)&pVertices,0)))
return E_FAIL;
memcpy(pVertices,cvVertices,sizeof(cvVertices));
g_pVertexBuffer->Unlock();
return S_OK;
}

void Render()
{
if(g_pd3dDevice==NULL)
return;
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_pVertexBuffer,0,sizeof(CUSTOMVERTEX));
g_pd3dDevice->SetFVF(D3DFVF_CUSTOMVERTEX);//设置点的样式
g_pd3dDevice->DrawPrimitive(D3DPT_TRIANGLELIST,0,1);
//结束在后台缓冲区的渲染图形
g_pd3dDevice->EndScene();
}
//将在后台缓冲区绘制的图形提交到前台缓冲区显示
g_pd3dDevice->Present(NULL,NULL,NULL,NULL);
}
void CleanUp()
{
if (g_pVertexBuffer!=NULL)
{
g_pVertexBuffer->Release();
g_pVertexBuffer=NULL;
}
if (g_pd3dDevice!=NULL)
{
g_pd3dDevice->Release();
g_pd3dDevice=NULL;

}
if (g_pD3D!=NULL)
{
g_pD3D->Release();
g_pD3D=NULL;
}
}
LRESULT WINAPI WinProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam)
{
switch(msg)
{
case WM_DESTROY:
CleanUp();
PostQuitMessage(0);
return 0;
case WM_PAINT:
Render();
ValidateRect(hWnd,NULL);
return 0;
}
return DefWindowProc(hWnd,msg,wParam,lParam);
}

INT WINAPI WinMain(HINSTANCE hInst,HINSTANCE,LPSTR ,INT)
{
WNDCLASSEX wc={sizeof(WNDCLASSEX),CS_CLASSDC,WinProc,0L,0L,
GetModuleHandle(NULL),NULL,NULL,NULL,NULL,"ClassName",NULL};
RegisterClassEx(&wc);
//创建窗口
HWND hWnd=CreateWindow("ClassName","第一个Directx程序",WS_OVERLAPPEDWINDOW,200,100,600,500,
NULL,NULL,wc.hInstance,NULL);
//初始化
if (SUCCEEDED(InitD3D(hWnd)))
{
ShowWindow(hWnd,SW_SHOWDEFAULT);
UpdateWindow(hWnd);
if (SUCCEEDED(InitialiseVertexBuffer()))
{
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: