以MFC为框架用VS2017使用D3D绘制一个立方体每个面贴不同的图片
-
创建MFC项目 打开Visual Studio 2017,选择“创建新项目”,在“Visual C++”下选择“MFC应用程序”,填写项目名称和保存位置,点击“确定”按钮,进入“MFC应用程序向导”页面。在该页面中,选择“应用程序类型”为“对话框”,勾选“使用DirectX”,点击“下一步”按钮,根据需要设置应用程序的选项,点击“完成”按钮创建项目。
-
配置DirectX环境 打开“项目属性”页面,选择“VC++目录”选项卡,在“包含目录”和“库目录”中添加DirectX SDK的路径。然后选择“链接器”选项卡,在“输入”中添加“d3d9.lib”和“d3dx9.lib”库文件。
-
创建立方体 在对话框类的头文件中定义DirectX相关的变量和函数:
#include <d3d9.h>
#include <d3dx9.h>
LPDIRECT3D9 g_pD3D = NULL;
LPDIRECT3DDEVICE9 g_pd3dDevice = NULL;
LPD3DXMESH g_pMesh = NULL;
D3DMATERIAL9 g_Material;
LPDIRECT3DTEXTURE9 g_pTexture[6] = { NULL };
void InitDirectX(HWND hWnd);
void Render();
void Cleanup();
在对话框类的实现文件中实现DirectX相关的函数:
void CMyDlg::InitDirectX(HWND hWnd)
{
// 创建D3D对象
g_pD3D = Direct3DCreate9(D3D_SDK_VERSION);
// 设置D3D参数
D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory(&d3dpp, sizeof(d3dpp));
d3dpp.Windowed = TRUE;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;
// 创建D3D设备
g_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &g_pd3dDevice);
// 创建立方体
D3DXCreateBox(g_pd3dDevice, 1.0f, 1.0f, 1.0f, &g_pMesh, NULL);
// 创建纹理
D3DXCreateTextureFromFile(g_pd3dDevice, L"face1.jpg", &g_pTexture[0]);
D3DXCreateTextureFromFile(g_pd3dDevice, L"face2.jpg", &g_pTexture[1]);
D3DXCreateTextureFromFile(g_pd3dDevice, L"face3.jpg", &g_pTexture[2]);
D3DXCreateTextureFromFile(g_pd3dDevice, L"face4.jpg", &g_pTexture[3]);
D3DXCreateTextureFromFile(g_pd3dDevice, L"face5.jpg", &g_pTexture[4]);
D3DXCreateTextureFromFile(g_pd3dDevice, L"face6.jpg", &g_pTexture[5]);
// 设置材质
ZeroMemory(&g_Material, sizeof(g_Material));
g_Material.Diffuse.r = 1.0f;
g_Material.Diffuse.g = 1.0f;
g_Material.Diffuse.b = 1.0f;
g_Material.Diffuse.a = 1.0f;
g_pd3dDevice->SetMaterial(&g_Material);
// 开启光照
g_pd3dDevice->SetRenderState(D3DRS_LIGHTING, TRUE);
g_pd3dDevice->SetRenderState(D3DRS_AMBIENT, D3DCOLOR_XRGB(100, 100, 100));
g_pd3dDevice->SetRenderState(D3DRS_NORMALIZENORMALS, TRUE);
}
void CMyDlg::Render()
{
// 清空屏幕
g_pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,
D3DCOLOR_XRGB(0, 0, 255), 1.0f, 0);
// 开始绘制
g_pd3dDevice->BeginScene();
for (DWORD i = 0; i < 6; i++)
{
g_pd3dDevice->SetTexture(0, g_pTexture[i]);
g_pMesh->DrawSubset(i);
}
// 结束绘制
g_pd3dDevice->EndScene();
// 显示图像
g_pd3dDevice->Present(NULL, NULL, NULL, NULL);
}
void CMyDlg::Cleanup()
{
// 释放资源
if (g_pMesh != NULL)
g_pMesh->Release();
for (DWORD i = 0; i < 6; i++)
{
if (g_pTexture[i] != NULL)
g_pTexture[i]->Release();
}
if (g_pd3dDevice != NULL)
g_pd3dDevice->Release();
if (g_pD3D != NULL)
g_pD3D->Release();
}
- 调用DirectX函数 在对话框类的OnInitDialog函数中调用InitDirectX函数初始化DirectX环境,在OnPaint函数中调用Render函数绘制立方体,在OnDestroy函数中调用Cleanup函数释放资源:
BOOL CMyDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
// 初始化DirectX
InitDirectX(m_hWnd);
return TRUE;
}
void CMyDlg::OnPaint()
{
CPaintDC dc(this); // device context for painting
// 绘制立方体
Render();
}
void CMyDlg::OnDestroy()
{
// 释放资源
Cleanup();
CDialogEx::OnDestroy();
}
至此,一个使用D3D绘制立方体,每个面贴不同的图片的程序就完成了
原文地址: https://www.cveoy.top/t/topic/eCQ5 著作权归作者所有。请勿转载和采集!