您的位置:首页 > 其它

MFC D3D绘制三角形

2017-03-14 13:43 405 查看
添加头文件以及定义结构体

#include <d3d9.h>
#include <d3dx9.h>
#pragma comment(lib, "d3d9.lib")
#pragma comment(lib, "d3dx9.lib")

struct CUSTOMVERTEX
{
FLOAT x, y, z, rhw; // The transformed position for the vertex
DWORD color;        // The vertex color
};
#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZRHW|D3DFVF_DIFFUSE)


定义变量:

IDirect3D9 *pDirect9;
IDirect3DDevice9 *pDevice9;
LPDIRECT3DVERTEXBUFFER9 m_VB;

使用类向导添加WM_TIMER以及WM_CLOSE

在OnInitDialog()函数里面添加:
pDirect9 = Direct3DCreate9(D3D_SDK_VERSION);
if (pDirect9){
D3DCAPS9 Caps;
pDirect9->GetDeviceCaps(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, &Caps);
int vp = 0;
if (Caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT){
vp = D3DCREATE_HARDWARE_VERTEXPROCESSING;
}
else{
vp = D3DCREATE_SOFTWARE_VERTEXPROCESSING;
}

D3DPRESENT_PARAMETERS dp;
dp.BackBufferWidth = 640;									//后备缓冲表面的宽度(以像素为单位)
dp.BackBufferHeight = 480;									//后备缓冲表面的高度(以像素为单位)
dp.BackBufferCount = 1;										//后备缓冲表面的数量,通常设为“1”,即只有一个后备表面
dp.BackBufferFormat = D3DFMT_A8R8G8B8;						//后备缓冲表面的像素格式(如:32位像素格式为D3DFMT——A8R8G8B8)
dp.MultiSampleType = D3DMULTISAMPLE_NONE;					//全屏抗锯齿的类型,详情请看SDK
dp.MultiSampleQuality = 0;									//全屏抗锯齿的质量等级,详情看SDK
dp.SwapEffect = D3DSWAPEFFECT_DISCARD;						//指定表面在交换链中是如何被交换的,取D3DSWAPEFFECT枚举类型中的一个成员。其中D3DSWAPEFFECT_DISCARD是最有效的
dp.hDeviceWindow = m_hWnd;
dp.Windowed = true;											//设为true则为窗口模式,false则为全屏模式
dp.EnableAutoDepthStencil = true;							//设为true,D3D将自动创建深度/模版缓冲
dp.AutoDepthStencilFormat = D3DFMT_D24S8;					//深度/模版缓冲的格式
dp.Flags = 0;												//一些附加特性,设为0或D3DPRESENTFLAG类型的一个成员。下列两个最常用的标志全部的标志请查阅SDK:
dp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;	//刷新率,设定D3DPRESENT_RATE_DEFAULT使用默认刷新率
dp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;	//属于D3DPRESENT成员,又有两个常用标志,其余请查SDK:D3DPRESENT_INTERVAL_IMMEDIATE——立即交换.D3DPRESENT_INTERVAL_DEFAULT——D3D选择交换速度,通常等于刷新率

HRESULT hr = pDirect9->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, m_hWnd, vp, &dp, &pDevice9);
if (FAILED(hr)){
// try again using a 16-bit depth buffer
dp.AutoDepthStencilFormat = D3DFMT_D16;

hr = pDirect9->CreateDevice(
D3DADAPTER_DEFAULT,
D3DDEVTYPE_HAL,
m_hWnd,
vp,
&dp,
&pDevice9);

if (FAILED(hr)){
pDirect9->Release(); // done with d3d9 object
::MessageBox(0, L"CreateDevice() - FAILED", 0, 0);
return false;
}
}

CUSTOMVERTEX Vertices[] =
{
{ 150.0f, 50.0f, 0.5f, 1.0f, D3DCOLOR_XRGB(255, 0, 0), }, // x, y, z, rhw, color
{ 250.0f, 250.0f, 0.5f, 1.0f, D3DCOLOR_XRGB(0, 255, 0), },
{ 50.0f, 250.0f, 0.5f, 1.0f, D3DCOLOR_XRGB(0, 0, 255), },
};
pDevice9->CreateVertexBuffer(3 * sizeof(CUSTOMVERTEX), 0, D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT, &m_VB, NULL);

VOID* pVertices;
m_VB->Lock(0, sizeof(Vertices), (void**)&pVertices, 0);
memcpy(pVertices, Vertices, sizeof(Vertices));
m_VB->Unlock();
}

SetTimer(0, 100, NULL);


定时器函数:

if (pDevice9){
pDevice9->BeginScene();
pDevice9->Clear(0, //要清除的矩形的个数
0, //指向一个矩形数组的首地址,如果该值为NULL,则将整个视口清除
D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, //D3DCLEAR_STENCIL,用Stencil 这个参数的值来清除模板缓存。
//D3DCLEAR_TARGET,用指定的颜色清除目标表面。
//D3DCLEAR_ZBUFFER,用指定的Z值清除深度缓存。
0x00FF0000, //指定颜色。
1.0f, //指定深度(0.0—1.0)
0	//指定模板缓存的值
);
pDevice9->SetStreamSource(0, //渲染数据流序号
m_VB,					//进行绑定的顶点缓冲区指针
0,						//进行绑定连接的渲染数据流的起始位置
sizeof(CUSTOMVERTEX)	//渲染数据流中一个顶点所占的内存的大小
);
pDevice9->SetFVF(D3DFVF_CUSTOMVERTEX);
//绘制三角形
pDevice9->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 1);
pDevice9->EndScene();
pDevice9->Present(NULL, //要展现的源矩形表面,一般为NUILL,表示展现整个源表面
NULL, //要展现的目标矩形表面,一般可以设为NULL,表示展现到整个窗口或全屏幕式下的这个屏幕
m_hWnd, //要展现的目的窗口的句柄,一般为NULL,表示展现到创建Direct3D设备指定的目标窗口
NULL //”脏区域”,一般设为NULL
);
}


退出:

if (pDevice9){
pDevice9->Release();
pDevice9 = NULL;
}
if (pDirect9){
pDirect9->Release();
pDirect9 = NULL;
}
KillTimer(0);


运行效果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: