以下是一个简单的代码示例,实现了用D3D绘制一个单文档类型的立方体,每个面贴不同的图片。需要注意的是,此示例仅为参考,实际使用时需要根据自己的需求进行修改和调整。

首先,创建一个MFC单文档应用程序,在Document类中添加以下成员变量和方法:

// Document.h
public:
    LPDIRECT3DDEVICE9 m_pd3dDevice;
    LPDIRECT3DVERTEXBUFFER9 m_pVertexBuffer;
    LPDIRECT3DTEXTURE9 m_pTexture[6];

private:
    void InitDirect3D();
    void InitVertexBuffer();
    void InitTexture();
    void Render();

其中,m_pd3dDevice是Direct3D设备对象,m_pVertexBuffer是顶点缓冲区对象,m_pTexture是纹理对象数组。InitDirect3D方法用于初始化Direct3D,InitVertexBuffer方法用于初始化顶点缓冲区,InitTexture方法用于初始化纹理,Render方法用于绘制立方体。

在Document.cpp中实现这些方法:

// Document.cpp
void CMyDoc::InitDirect3D()
{
    LPDIRECT3D9 pD3D = Direct3DCreate9(D3D_SDK_VERSION);
    ASSERT(pD3D != NULL);

    D3DPRESENT_PARAMETERS d3dpp;
    memset(&d3dpp, 0, sizeof(d3dpp));
    d3dpp.Windowed = TRUE;
    d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
    d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;

    HWND hWnd = AfxGetMainWnd()->GetSafeHwnd();
    ASSERT(hWnd != NULL);

    HRESULT hr = pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
        D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &m_pd3dDevice);
    ASSERT(SUCCEEDED(hr));

    pD3D->Release();
}

void CMyDoc::InitVertexBuffer()
{
    struct Vertex
    {
        float x, y, z;
        float nx, ny, nz;
        float u, v;
    };
    Vertex vertices[] = {
        { -1.0f, -1.0f, -1.0f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f },
        { -1.0f,  1.0f, -1.0f, 0.0f, 0.0f, -1.0f, 0.0f, 1.0f },
        {  1.0f,  1.0f, -1.0f, 0.0f, 0.0f, -1.0f, 1.0f, 1.0f },
        {  1.0f, -1.0f, -1.0f, 0.0f, 0.0f, -1.0f, 1.0f, 0.0f },

        { -1.0f, -1.0f,  1.0f, 0.0f, 0.0f,  1.0f, 1.0f, 0.0f },
        {  1.0f, -1.0f,  1.0f, 0.0f, 0.0f,  1.0f, 0.0f, 0.0f },
        {  1.0f,  1.0f,  1.0f, 0.0f, 0.0f,  1.0f, 0.0f, 1.0f },
        { -1.0f,  1.0f,  1.0f, 0.0f, 0.0f,  1.0f, 1.0f, 1.0f },

        { -1.0f,  1.0f, -1.0f, 0.0f, 1.0f,  0.0f, 0.0f, 0.0f },
        { -1.0f,  1.0f,  1.0f, 0.0f, 1.0f,  0.0f, 0.0f, 1.0f },
        {  1.0f,  1.0f,  1.0f, 0.0f, 1.0f,  0.0f, 1.0f, 1.0f },
        {  1.0f,  1.0f, -1.0f, 0.0f, 1.0f,  0.0f, 1.0f, 0.0f },

        { -1.0f, -1.0f, -1.0f, 0.0f, -1.0f, 0.0f, 1.0f, 0.0f },
        {  1.0f, -1.0f, -1.0f, 0.0f, -1.0f, 0.0f, 0.0f, 0.0f },
        {  1.0f, -1.0f,  1.0f, 0.0f, -1.0f, 0.0f, 0.0f, 1.0f },
        { -1.0f, -1.0f,  1.0f, 0.0f, -1.0f, 0.0f, 1.0f, 1.0f },

        {  1.0f, -1.0f, -1.0f, 1.0f, 0.0f,  0.0f, 0.0f, 0.0f },
        {  1.0f,  1.0f, -1.0f, 1.0f, 0.0f,  0.0f, 0.0f, 1.0f },
        {  1.0f,  1.0f,  1.0f, 1.0f, 0.0f,  0.0f, 1.0f, 1.0f },
        {  1.0f, -1.0f,  1.0f, 1.0f, 0.0f,  0.0f, 1.0f, 0.0f },

        { -1.0f, -1.0f, -1.0f, -1.0f, 0.0f, 0.0f, 1.0f, 1.0f },
        { -1.0f, -1.0f,  1.0f, -1.0f, 0.0f, 0.0f, 0.0f, 1.0f },
        { -1.0f,  1.0f,  1.0f, -1.0f, 0.0f, 0.0f, 0.0f, 0.0f },
        { -1.0f,  1.0f, -1.0f, -1.0f, 0.0f, 0.0f, 1.0f, 0.0f }
    };

    HRESULT hr = m_pd3dDevice->CreateVertexBuffer(sizeof(vertices),
        D3DUSAGE_WRITEONLY, 0, D3DPOOL_DEFAULT, &m_pVertexBuffer, NULL);
    ASSERT(SUCCEEDED(hr));

    void* pVertices = NULL;
    hr = m_pVertexBuffer->Lock(0, sizeof(vertices), &pVertices, 0);
    ASSERT(SUCCEEDED(hr));

    memcpy(pVertices, vertices, sizeof(vertices));
    m_pVertexBuffer->Unlock();
}

void CMyDoc::InitTexture()
{
    LPCTSTR strTexture[6] = {
        _T("texture1.jpg"),
        _T("texture2.jpg"),
        _T("texture3.jpg"),
        _T("texture4.jpg"),
        _T("texture5.jpg"),
        _T("texture6.jpg")
    };

    for (int i = 0; i < 6; i++)
    {
        HRESULT hr = D3DXCreateTextureFromFile(m_pd3dDevice, strTexture[i],
            &m_pTexture[i]);
        ASSERT(SUCCEEDED(hr));
    }
}

void CMyDoc::Render()
{
    m_pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,
        D3DCOLOR_XRGB(0, 0, 255), 1.0f, 0);

    m_pd3dDevice->BeginScene();

    m_pd3dDevice->SetFVF(D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_TEX1);

    for (int i = 0; i < 6; i++)
    {
        m_pd3dDevice->SetTexture(0, m_pTexture[i]);

        m_pVertexBuffer->SetDataOffset(0);
        m_pd3dDevice->SetStreamSource(0, m_pVertexBuffer, 0, sizeof(Vertex));

        m_pd3dDevice->DrawPrimitive(D3DPT_TRIANGLEFAN, i * 4, 2);
    }

    m_pd3dDevice->EndScene();

    m_pd3dDevice->Present(NULL, NULL, NULL, NULL);
}

在OnNewDocument方法中调用这些方法:

// Document.cpp
BOOL CMyDoc::OnNewDocument()
{
    if (!CDocument::OnNewDocument())
        return FALSE;

    InitDirect3D();
    InitVertexBuffer();
    InitTexture();

    return TRUE;
}

最后,在View的OnDraw方法中调用Document的Render方法:

// View.cpp
void CMyView::OnDraw(CDC* pDC)
{
    CMyDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);

    pDoc->Render();
}

这样就完成了用D3D绘制一个单文档类型的立方体,每个面贴不同的图片的任务

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

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

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