1. 创建MFC项目 打开Visual Studio 2017,选择“创建新项目”,在“Visual C++”下选择“MFC应用程序”,填写项目名称和保存位置,点击“确定”按钮,进入“MFC应用程序向导”页面。在该页面中,选择“应用程序类型”为“对话框”,勾选“使用DirectX”,点击“下一步”按钮,根据需要设置应用程序的选项,点击“完成”按钮创建项目。

  2. 配置DirectX环境 打开“项目属性”页面,选择“VC++目录”选项卡,在“包含目录”和“库目录”中添加DirectX SDK的路径。然后选择“链接器”选项卡,在“输入”中添加“d3d9.lib”和“d3dx9.lib”库文件。

  3. 创建立方体 在对话框类的头文件中定义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();
}
  1. 调用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绘制立方体,每个面贴不同的图片的程序就完成了

以MFC为框架用VS2017使用D3D绘制一个立方体每个面贴不同的图片

原文地址: https://www.cveoy.top/t/topic/eCQ5 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录