前些天在看微软的一个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 shaderpixel 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

posted on 2011-05-22 22:36  Bester  阅读(282)  评论(0编辑  收藏  举报