Document/View框架中初始化Direct3D

一般情况下,初始化Direct3D包含以下四个步骤:

1、获得IDirect3D9接口指针;

2、检查显卡是否支持硬件顶点处理;

3、定义一个D3DPRESENT _PARAMETERS变量,指定相关的显示特性;

4、创建IDirect3DDevice9对象,该对象指向一个代表图形设备的C++对象。

具体在文档/视图框架中初始化过程如下:

1、在View类中添加两个成员变量(m_pD3d应该不是必须的):

class CXXView : public CView
{
private:
LPDIRECT3D9 m_pD3d;
LPDIRECT3DDEVICE9 m_pD3dDevice;
protected: // create from serialization only
CFirstView();
DECLARE_DYNCREATE(CFirstView)

// Attributes
public:
CFirstDoc* GetDocument() const;
...
};

2、进行初始化工作。可以首先将初始化的工作封装为一个View类的成员函数:

bool CXXView::D3dInit()
{
HWND hwnd = GetSafeHwnd();
CRect clientrect;
GetClientRect(&clientrect);
m_pD3d = Direct3DCreate9(D3D_SDK_VERSION);
if(m_pD3d == NULL)
{
MessageBox("Fail to create D3d interface");
return false;
}
D3DCAPS9 caps;
m_pD3d->GetDeviceCaps(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, &caps);
int vp = 0;
if(caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT)
vp = D3DCREATE_HARDWARE_VERTEXPROCESSING;
else
vp = D3DCREATE_SOFTWARE_VERTEXPROCESSING;
D3DPRESENT_PARAMETERS para;
ZeroMemory(&para,sizeof(para));
para.BackBufferWidth = clientrect.Width();
para.BackBufferHeight = clientrect.Height();
para.BackBufferFormat = D3DFMT_A8R8G8B8; //像素格式
para.BackBufferCount = 1;
para.MultiSampleType = D3DMULTISAMPLE_NONE;
para.MultiSampleQuality = 0;
para.SwapEffect = D3DSWAPEFFECT_DISCARD;
para.hDeviceWindow = hwnd;
para.Windowed = TRUE;
para.EnableAutoDepthStencil = true;
para.AutoDepthStencilFormat = D3DFMT_D24S8; // depth format
para.Flags = 0;
para.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;
para.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;

HRESULT hr = m_pD3d->CreateDevice(D3DADAPTER_DEFAULT,
D3DDEVTYPE_HAL,
hwnd,
vp,
&para,
&m_pD3dDevice);
if(FAILED(hr))
{
//         DWORD dw = GetLastError();
//         CString error;
//         error.Format("%u,%u",dw,hr);
//         MessageBox(error);
MessageBox("Fail to create D3d device");
return false;
}
return true;
}

3、重载OnInitialUpdate虚函数,在其中调用D3dInit:

void CXXView::OnInitialUpdate()
{
CView::OnInitialUpdate();

// TODO: Add your specialized code here and/or call the base class
if(!D3dInit())
MessageBox("D3d initialization failed!");
}

4、在析构函数释放设备和D3d对象:

CXXView::~CXXView()
{
if(m_pD3dDevice != NULL)
m_pD3dDevice->Release();
if(m_pD3d != NULL)
m_pD3d->Release();
}

5、可以在OnPaint中测试一下:

void CXXView::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: Add your message handler code here
// Do not call CView::OnPaint() for painting messages
if(m_pD3dDevice)
{
m_pD3dDevice->Clear(0, 0, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,0x00000000, 1.0f, 0);
m_pD3dDevice->Present(0,0,0,0);
}
}

原文链接: https://www.cnblogs.com/youthlion/archive/2012/04/27/2474137.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/48726

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月9日 上午12:30
下一篇 2023年2月9日 上午12:31

相关推荐