天天看点

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

继续阅读