添加头文件
#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