前些天在看微软的一个HandsOnLab和《Intro to D3d10》的时候,发现一个挺好的设计框架,简洁优美,很方便初学者搭建自己一些简单的绘制程序,修改下后拿来分享下。
关键是Run()和里面的Setup()和MessageLoop()。
class BasicDraw
{
public:
HRESULT Run();
BasicDraw();
~BasicDraw();
private:
void InitializeApp();
void CleanUp();
HRESULT Setup();
HRESULT CreateDisplayWindow();
static LRESULT CALLBACK MyWndProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam);
HRESULT CreateDevice();
HRESULT CreateAppResource();//里面创建原始数据,vertex shader,pixel shader,各种buffer。
HRESULT CompileShaderFromFile(WCHAR* szFileName,LPCSTR szEntryPoint,LPCSTR szShaderModel,
ID3DBlob** ppBlobOut,const D3D_SHADER_MACRO* pDefines=NULL);
HRESULT CreateConstantBuffer(UINT uSize,ID3D11Buffer** ppBuffer);
HRESULT MessageLoop();
HRESULT DrawFunction();
private:
ID3D11Device* m_pDevice;
ID3D11DeviceContext* m_pContext;
IDXGISwapChain* m_pSwapChain;
ID3D11RenderTargetView* m_pRTV;
ID3D11Texture2D *m_pDepthStencil;
ID3D11DepthStencilView *m_pDepthStencilView;
ID3D11VertexShader* m_pVertexShader;
ID3D11PixelShader* m_pPixelShader;
ID3D11InputLayout* m_pInputLayout;
ID3D11Buffer* m_pVertexBuffer;
ID3D11Buffer* m_pIndexBuffer;
ID3D11Buffer* m_pCBuffer;
XMMATRIX m_World1;
XMMATRIX m_View;
XMMATRIX m_Projection;
HWND m_hWnd;
HINSTANCE m_hInstance;
};
主函数里面就一个Run函数。
int main( )
{
HRESULT hr=S_OK;
BasicDraw basicApp;
hr=basicApp.Run();
return hr;
}
Run函数里面主要一个Setup()初始化窗口,设备,资源等,而MessageLoop()就是我们常见的windows的消息循环了。
HRESULT BasicDraw::Run()
{
HRESULT hr=S_OK;
IFR(Setup());
IFR(MessageLoop());
return hr;
}
初始化函数Setup()如下,CreateDisplayWindow()显然初始化HWND windows,CreateDevice()就是初始化我们Directx11里面最常用一些设备接口ID3D11Device,ID3D11DeviceContext,IDXGISwapChain等等,而CreateAppResource()就是初始化程序里面的一些数组,Buffer等等了:
HRESULT BasicDraw::Setup()
{
HRESULT hr=S_OK;
IFR(CreateDisplayWindow());
IFR(CreateDevice());
IFR(CreateAppResource());
return hr;
}
MessageLoop()就是我们常见的消息循环了
HRESULT BasicDraw::MessageLoop()
{
HRESULT hr=S_OK;
MSG msg;
msg.message=WM_NULL;
while(WM_QUIT!=msg.message)
{
if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
{
IFR(DrawFunction());
}
}
return hr;
}
这个Directx的框架就跟OGRE的有点像,对外接口只要一个Run()启动,外人只要知道Run()负责一切就可以了。而Run()里面的也清晰分为Setup()和MessageLoop()。Setup()在开始的时候初始化窗口,设备,资源等等,另一个MessageLoop()就负责每帧的更新和绘制,真个程序思路非常的清晰。下一次奉献个具体的绘制例子来展示下绘制的细节。
ps:我上传了一个用这个框架写的完整的程序,绘制立方体和四面体。大家有兴趣可以下来看看:http://download.csdn.net/detail/qiul12345/3947822