|
|
以下是我写的,不知道出什么情况了
#include<windows.h>
#include<d3d9.h>
#include <d3dx9.h>
#pragma comment(lib, "d3d9.lib" )
#pragma comment( lib, "d3dx9.lib")
LPDIRECT3D9 g_pD3D = NULL;//D3D指针
LPDIRECT3DDEVICE9 g_pD3DDevice = NULL;//D3D设备指针
LPDIRECT3DVERTEXBUFFER9 g_pVertexBuffer=NULL;//顶点缓冲
//自定义顶点格式
struct CUSTOMVERTEX
{
FLOAT x,y,z,rhw;//三维坐标
DWORD colour;//顶点颜色
};
#define D3DFVF_CUSTOMVERTEX D3DFVF_XYZRHW|D3DFVF_DIFFUSE
#define SafeRelease(pObject)if(pObject!=NULL){pObject->Release();pObject=NULL;}
HRESULT InitialiseD3D(HWND hWnd)
{
//初始化D3D接口
g_pD3D=Direct3DCreate9(D3D_SDK_VERSION);
if(g_pD3D==NULL)
{
MessageBox(NULL,"asdd","error",MB_OK);
}
//获取显卡显示模式
D3DDISPLAYMODE d3ddm;
if(FAILED(g_pD3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT,&d3ddm)))
{
MessageBox(NULL,"asdd","error",MB_OK);
}
//创建显示结构
D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory(&d3dpp,sizeof(d3dpp));
//填充结构
d3dpp.Windowed=TRUE;//窗口模式
d3dpp.SwapEffect=D3DSWAPEFFECT_DISCARD;//翻转模式
d3dpp.BackBufferFormat=d3ddm.Format;//后缓冲格式
//创建3D设备指针
if(FAILED(g_pD3D->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hWnd,D3DCREATE_SOFTWARE_VERTEXPROCESSING,
&d3dpp,&g_pD3DDevice)))
{
MessageBox(NULL,"asdd","error",MB_OK);
}
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.f,300.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)))
{
MessageBox(NULL,"asdd","error",MB_OK);
}
//锁定顶点缓冲
if(FAILED(g_pVertexBuffer->Lock(0,sizeof(cvVertices),(void**)&pVertices,0)))
{
MessageBox(NULL,"asdd","error",MB_OK);
}
//拷贝顶点信息
memcpy(pVertices,cvVertices,sizeof(cvVertices));
//解锁
g_pVertexBuffer->Unlock();
return S_OK;
}
void Render()
{
if(g_pD3DDevice== NULL)
{
MessageBox(NULL,"asdd","error",MB_OK);
}
//清空3D设备
g_pD3DDevice->Clear(0,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(255,255,255),1.0f,0);
//开始绘制
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-> resent(NULL,NULL,NULL,NULL);
}
//释放建立的对象
void CleanUp()
{
SafeRelease(g_pVertexBuffer);
SafeRelease(g_pD3DDevice);
SafeRelease(g_pD3D);
}
void GameLoop()
{
MSG msg;
BOOL fMessage;
PeekMessage(&msg,NULL,0U,0U,PM_NOREMOVE);
while(msg.message != WM_QUIT)
{
fMessage=PeekMessage(&msg,NULL,0U,0U,PM_NOREMOVE);
if(fMessage)
{
//处理消息
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
{
//没消息时渲染
Render();
}
}
}
// WINDOW消息处理
LRESULT WINAPI WinProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam)
{
switch(msg)
{
case WM_DESTROY:
PostQuitMessage(0);
return 0;
break;
case WM_KEYUP:
switch(wParam)
{
case VK_ESCAPE:
// 退出
DestroyWindow(hWnd);
return 0;
break;
}
break;
}
return DefWindowProc(hWnd,msg,wParam,lParam);
}
//应用程序入口
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,
LPSTR lpCmdLine,int nCmdShow)
{
WNDCLASS wc;
wc.cbClsExtra= 0;
wc.cbWndExtra=0;
wc.hbrBackground=(HBRUSH)(COLOR_WINDOW+1);
wc.hCursor=NULL;
wc.hIcon=NULL;
wc.hInstance=hInstance;
wc.lpfnWndProc=WinProc;
wc.lpszClassName="window";
wc.lpszMenuName=NULL;
wc.style=CS_VREDRAW | CS_HREDRAW;
RegisterClass(&wc);
HWND hWnd=CreateWindow("window","haha",WS_OVERLAPPEDWINDOW,100,100,800,600,NULL,
NULL,hInstance,NULL);
RegisterClass(&wc);
if(!hWnd)
{
MessageBox(NULL,"asd","Error",MB_OK);
}
//初始D3D
if(SUCCEEDED(InitialiseD3D(hWnd)))
{
//显示窗口
ShowWindow(hWnd,SW_SHOWDEFAULT);
UpdateWindow(hWnd);
//初始化顶点缓冲
if(SUCCEEDED(InitialiseVertexBuffer()))
{
//进如循环
GameLoop();
}
}
CleanUp();
UnregisterClass("base",wc.hInstance);
return 0;
}
|
|