MFC D3D 导入模型(.X文件)

添加头文件

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

定义变量
private:
	IDirect3D9 *pDirect9;
	IDirect3DDevice9 *pDevice9;

	DWORD dwNumber;
	LPD3DXMESH pMesh;
	LPDIRECT3DTEXTURE9* g_pTexture;
	D3DMATERIAL9* g_pMaterials;

使用类向导添加WM_TIMER跟WM_CLOSE


在OnInitDialog()函数里面添加

pDirect9 = Direct3DCreate9(D3D_SDK_VERSION);
	if (pDirect9)
	{
		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选择交换速度,通常等于刷新率 
		pDirect9->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, m_hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &dp, &pDevice9);

		LPD3DXBUFFER pAdjacency;
		LPD3DXBUFFER pMaterials;
		dwNumber = 0;

		HRESULT hr = D3DXLoadMeshFromX("bigship1.x", D3DXMESH_MANAGED, pDevice9, &pAdjacency, &pMaterials, NULL, &dwNumber, &pMesh);
		if (SUCCEEDED(hr)){
			D3DXMATERIAL *pMat = (D3DXMATERIAL *)pMaterials->GetBufferPointer();
			g_pTexture = new LPDIRECT3DTEXTURE9[dwNumber];
			g_pMaterials = new D3DMATERIAL9[dwNumber];

			for (int i = 0; i < dwNumber; i++){
				g_pMaterials[i] = pMat[i].MatD3D;
				g_pMaterials[i].Ambient = g_pMaterials[i].Diffuse;
				g_pTexture[i] = NULL;
				D3DXCreateTextureFromFile(pDevice9, pMat[i].pTextureFilename, &g_pTexture[i]);
			}
		}
		pAdjacency->Release();
		pMaterials->Release();
	}

	D3DXVECTOR3 dir(1.0f, -1.0f, 1.0f);
	D3DXCOLOR col(1.0f, 1.0f, 1.0f, 1.0f);
	D3DLIGHT9 light = InitDirectionalLight(&dir, &col);

	pDevice9->SetLight(0, &light);
	pDevice9->LightEnable(0, true);
	pDevice9->SetRenderState(D3DRS_NORMALIZENORMALS, true);
	pDevice9->SetRenderState(D3DRS_SPECULARENABLE, true);

	D3DXMATRIX V;
	D3DXVECTOR3 pos(4.0f, 4.0f, -13.0f);
	D3DXVECTOR3 target(0.0f, 0.0f, 0.0f);
	D3DXVECTOR3 up(0.0f, 1.0f, 0.0f);
	D3DXMatrixLookAtLH(&V, &pos, &target, &up);
	pDevice9->SetTransform(D3DTS_VIEW, &V);


	D3DXMATRIX proj;
	D3DXMatrixPerspectiveFovLH(&proj, D3DX_PI * 0.5f, (float)640.0f / (float)480.f, 1.0f, 1000.0f);
	pDevice9->SetTransform(D3DTS_PROJECTION, &proj);
	SetTimer(0, 100, NULL);


定义函数:

D3DLIGHT9 InitDirectionalLight(D3DXVECTOR3* direction, D3DXCOLOR* color)
{
	D3DLIGHT9 light;
	::ZeroMemory(&light, sizeof(light));

	light.Type = D3DLIGHT_DIRECTIONAL;
	light.Ambient = *color * 0.4f;
	light.Diffuse = *color;
	light.Specular = *color * 0.6f;
	light.Direction = *direction;

	return light;
}



定时器函数:

if (pDevice9){
		static float y = 0.0f;
		D3DXMATRIX yRot;
		D3DXMatrixRotationY(&yRot, y);
		y += 20.0f;

		if (y >= 360.0f){
			y = 0.0f;
		}
			
		D3DXMATRIX World = yRot;
		pDevice9->SetTransform(D3DTS_WORLD, &World);
		pDevice9->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(255, 0, 0), 1.0f, 0);
		pDevice9->BeginScene();
		for (int i = 0; i < dwNumber; i++){
			pDevice9->SetMaterial(&g_pMaterials[i]);
			pDevice9->SetTexture(0, g_pTexture[i]);
			pMesh->DrawSubset(i);
		}
		pDevice9->EndScene();

		pDevice9->Present(NULL, NULL, m_hWnd, NULL);
	}



退出函数

if (pDevice9){
		pDevice9->Release();
	}

	if (pDirect9){
		pDirect9->Release();
	}
	if (g_pTexture){
		delete[] g_pTexture;
	}
	if (g_pMaterials){
		delete[] g_pMaterials;
	}

	KillTimer(0);

运行效果图


demo:http://download.youkuaiyun.com/detail/sz76211822/9784143


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值