用VS2017以MFC为框架使用D3D绘制一个单文档类型的立方体每个面贴不同的图片
以下是一个简单的代码示例,实现了用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绘制一个单文档类型的立方体,每个面贴不同的图片的任务
原文地址: https://www.cveoy.top/t/topic/eCR5 著作权归作者所有。请勿转载和采集!