VS2017以MFC为框架使用D3D绘制一个单文档的立方体六个面贴不同的图片
以下是示例代码:
首先,在VS2017中创建一个MFC单文档应用程序。
在资源视图中添加六个位图资源文件,分别命名为“front.bmp”、“back.bmp”、“left.bmp”、“right.bmp”、“top.bmp”和“bottom.bmp”。
接下来,在View.cpp文件中添加以下代码:
#include "stdafx.h" #include "MFCApplication1.h" #include "View.h"
#ifdef _DEBUG #define new DEBUG_NEW #endif
// CView
IMPLEMENT_DYNCREATE(CView, CView)
BEGIN_MESSAGE_MAP(CView, CView) ON_WM_PAINT() END_MESSAGE_MAP()
// CView 构造/析构
CView::CView() noexcept { // TODO: 在此处添加构造代码
}
CView::~CView() { }
BOOL CView::PreCreateWindow(CREATESTRUCT& cs) { // TODO: 在此处通过修改 // CREATESTRUCT cs 来修改窗口类或样式
return CView::PreCreateWindow(cs);
}
// CView 绘图
void CView::OnDraw(CDC* /pDC/) { CMFCApplication1Doc* pDoc = GetDocument(); ASSERT_VALID(pDoc);
// TODO: 在此处为本机数据添加绘制代码
}
// CView 诊断
#ifdef _DEBUG void CView::AssertValid() const { CView::AssertValid(); }
void CView::Dump(CDumpContext& dc) const { CView::Dump(dc); }
CMFCApplication1Doc* CView::GetDocument() const // 非调试版本是内联的 { ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMFCApplication1Doc))); return (CMFCApplication1Doc*)m_pDocument; } #endif //_DEBUG
// CView 消息处理程序
void CView::OnPaint() { CPaintDC dc(this); // device context for painting
// TODO: 在此处添加消息处理程序代码
// 绘制立方体
DrawCube(dc);
}
void CView::DrawCube(CDC& dc) { // 创建Direct3D设备 IDirect3DDevice9* pD3DDevice = NULL; D3DPRESENT_PARAMETERS d3dpp = { 0 }; d3dpp.Windowed = TRUE; d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; d3dpp.BackBufferFormat = D3DFMT_UNKNOWN; LPDIRECT3D9 pD3D = Direct3DCreate9(D3D_SDK_VERSION); pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, m_hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &pD3DDevice);
// 设置顶点格式
struct CUSTOMVERTEX
{
FLOAT x, y, z;
DWORD color;
FLOAT u, v;
};
#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ | D3DFVF_DIFFUSE | D3DFVF_TEX1)
CUSTOMVERTEX vertices[] =
{
{ -1.0f, 1.0f, -1.0f, D3DCOLOR_XRGB(255, 255, 255), 0.0f, 0.0f },
{ 1.0f, 1.0f, -1.0f, D3DCOLOR_XRGB(255, 255, 255), 1.0f, 0.0f },
{ -1.0f, -1.0f, -1.0f, D3DCOLOR_XRGB(255, 255, 255), 0.0f, 1.0f },
{ 1.0f, -1.0f, -1.0f, D3DCOLOR_XRGB(255, 255, 255), 1.0f, 1.0f },
{ 1.0f, 1.0f, -1.0f, D3DCOLOR_XRGB(255, 255, 255), 0.0f, 0.0f },
{ 1.0f, 1.0f, 1.0f, D3DCOLOR_XRGB(255, 255, 255), 1.0f, 0.0f },
{ 1.0f, -1.0f, -1.0f, D3DCOLOR_XRGB(255, 255, 255), 0.0f, 1.0f },
{ 1.0f, -1.0f, 1.0f, D3DCOLOR_XRGB(255, 255, 255), 1.0f, 1.0f },
{ 1.0f, 1.0f, 1.0f, D3DCOLOR_XRGB(255, 255, 255), 0.0f, 0.0f },
{ -1.0f, 1.0f, 1.0f, D3DCOLOR_XRGB(255, 255, 255), 1.0f, 0.0f },
{ 1.0f, -1.0f, 1.0f, D3DCOLOR_XRGB(255, 255, 255), 0.0f, 1.0f },
{ -1.0f, -1.0f, 1.0f, D3DCOLOR_XRGB(255, 255, 255), 1.0f, 1.0f },
{ -1.0f, 1.0f, 1.0f, D3DCOLOR_XRGB(255, 255, 255), 0.0f, 0.0f },
{ -1.0f, 1.0f, -1.0f, D3DCOLOR_XRGB(255, 255, 255), 1.0f, 0.0f },
{ -1.0f, -1.0f, 1.0f, D3DCOLOR_XRGB(255, 255, 255), 0.0f, 1.0f },
{ -1.0f, -1.0f, -1.0f, D3DCOLOR_XRGB(255, 255, 255), 1.0f, 1.0f },
{ -1.0f, 1.0f, 1.0f, D3DCOLOR_XRGB(255, 255, 255), 0.0f, 0.0f },
{ 1.0f, 1.0f, 1.0f, D3DCOLOR_XRGB(255, 255, 255), 1.0f, 0.0f },
{ -1.0f, 1.0f, -1.0f, D3DCOLOR_XRGB(255, 255, 255), 0.0f, 1.0f },
{ 1.0f, 1.0f, -1.0f, D3DCOLOR_XRGB(255, 255, 255), 1.0f, 1.0f },
{ -1.0f, -1.0f, -1.0f, D3DCOLOR_XRGB(255, 255, 255), 0.0f, 0.0f },
{ 1.0f, -1.0f, -1.0f, D3DCOLOR_XRGB(255, 255, 255), 1.0f, 0.0f },
{ -1.0f, -1.0f, 1.0f, D3DCOLOR_XRGB(255, 255, 255), 0.0f, 1.0f },
{ 1.0f, -1.0f, 1.0f, D3DCOLOR_XRGB(255, 255, 255), 1.0f, 1.0f },
};
LPDIRECT3DVERTEXBUFFER9 pVB = NULL;
pD3DDevice->CreateVertexBuffer(sizeof(vertices), 0, D3DFVF_CUSTOMVERTEX,
D3DPOOL_DEFAULT, &pVB, NULL);
VOID* pVertices;
pVB->Lock(0, sizeof(vertices), (void**)&pVertices, 0);
memcpy(pVertices, vertices, sizeof(vertices));
pVB->Unlock();
// 创建纹理
LPDIRECT3DTEXTURE9 pTexture[6];
D3DXCreateTextureFromResource(pD3DDevice, AfxGetResourceHandle(),
MAKEINTRESOURCE(IDB_FRONT), &pTexture[0]);
D3DXCreateTextureFromResource(pD3DDevice, AfxGetResourceHandle(),
MAKEINTRESOURCE(IDB_BACK), &pTexture[1]);
D3DXCreateTextureFromResource(pD3DDevice, AfxGetResourceHandle(),
MAKEINTRESOURCE(IDB_LEFT), &pTexture[2]);
D3DXCreateTextureFromResource(pD3DDevice, AfxGetResourceHandle(),
MAKEINTRESOURCE(IDB_RIGHT), &pTexture[3]);
D3DXCreateTextureFromResource(pD3DDevice, AfxGetResourceHandle(),
MAKEINTRESOURCE(IDB_TOP), &pTexture[4]);
D3DXCreateTextureFromResource(pD3DDevice, AfxGetResourceHandle(),
MAKEINTRESOURCE(IDB_BOTTOM), &pTexture[5]);
// 绘制
pD3DDevice->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,
D3DCOLOR_XRGB(0, 0, 255), 1.0f, 0);
pD3DDevice->BeginScene();
pD3DDevice->SetFVF(D3DFVF_CUSTOMVERTEX);
pD3DDevice->SetStreamSource(0, pVB, 0, sizeof(CUSTOMVERTEX));
for (int i = 0; i < 6; i++)
{
pD3DDevice->SetTexture(0, pTexture[i]);
pD3DDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP, i * 4, 2);
}
pD3DDevice->EndScene();
pD3DDevice->Present(NULL, NULL, NULL, NULL);
// 释放资源
pVB->Release();
for (int i = 0; i < 6; i++)
{
pTexture[i]->Release();
}
pD3DDevice->Release();
pD3D->Release();
}
在DrawCube函数中,首先创建Direct3D设备,然后设置顶点格式和顶点缓冲区,接着创建六个纹理,并将其分别绑定到立方体的六个面上,最后进行绘制。
注意,在绘制之前,需要调用Clear函数清空屏幕并设置背景色,然后调用BeginScene函数开始渲染,并在渲染完成后调用EndScene函数结束渲染,最后调用Present函数显示图像。
运行程序,即可看到立方体的六个面贴上了不同的图片
原文地址: https://www.cveoy.top/t/topic/eDny 著作权归作者所有。请勿转载和采集!