天天看點

Directx11 HelloWorld之_一個簡潔漂亮的架構

  前些天在看微軟的一個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

繼續閱讀