• 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 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

  • 相关阅读:
    MSchart设置网格线
    搭建ELDK交叉编译环境
    Virtualbox设置共享文件夹的方法
    VS2010自动关闭问题的解决方法
    如何让PHPCms内容页支持JavaScript
    Phpcms V9 调用全站最新文章的代码
    Phpcms V9 调用随机文章的方法
    VMware下Ubuntu不能和主机共享文件夹的解决方法
    Xshell无法连接Ubuntu的解决办法
    Phpcms V9 调用全站文章排行的解决方案
  • 原文地址:https://www.cnblogs.com/bester/p/3255802.html
Copyright © 2020-2023  润新知