MFC D3D绘制三角形

添加头文件以及定义结构体

#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);


运行效果:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值