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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
以下是使用 DirectX 12 编写的 "Hello World" 示例代码: ```cpp #include <windows.h> #include <d3d12.h> #include <dxgi1_4.h> #pragma comment(lib, "d3d12.lib") #pragma comment(lib, "dxgi.lib") int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { // 创建窗口 HWND hWnd = CreateWindowEx(0, L"static", L"DirectX12 HelloWorld", WS_OVERLAPPEDWINDOW, 0, 0, 640, 480, nullptr, nullptr, hInstance, nullptr); // 初始化 DirectX 12 IDXGIFactory4* dxgiFactory = nullptr; HRESULT hr = CreateDXGIFactory1(IID_PPV_ARGS(&dxgiFactory)); if (FAILED(hr)) return 1; IDXGIAdapter1* adapter = nullptr; for (UINT adapterIndex = 0; DXGI_ERROR_NOT_FOUND != dxgiFactory->EnumAdapters1(adapterIndex, &adapter); ++adapterIndex) { DXGI_ADAPTER_DESC1 adapterDesc; adapter->GetDesc1(&adapterDesc); if (adapterDesc.Flags & DXGI_ADAPTER_FLAG_SOFTWARE) { continue; } // 创建设备 hr = D3D12CreateDevice(adapter, D3D_FEATURE_LEVEL_11_0, IID_PPV_ARGS(&device)); if (FAILED(hr)) return 1; // 退出循环 break; } // 创建命令队列 D3D12_COMMAND_QUEUE_DESC queueDesc = {}; queueDesc.Type = D3D12_COMMAND_LIST_TYPE_DIRECT; hr = device->CreateCommandQueue(&queueDesc, IID_PPV_ARGS(&commandQueue)); if (FAILED(hr)) return 1; // 创建交换链 DXGI_MODE_DESC backBufferDesc = {}; backBufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; backBufferDesc.Width = 640; backBufferDesc.Height = 480; backBufferDesc.RefreshRate.Numerator = 60; backBufferDesc.RefreshRate.Denominator = 1; backBufferDesc.Scaling = DXGI_MODE_SCALING_UNSPECIFIED; backBufferDesc.ScanlineOrdering = DXGI_MODE_SCANLINE_ORDER_UNSPECIFIED; DXGI_SWAP_CHAIN_DESC swapChainDesc = {}; swapChainDesc.BufferCount = 2; swapChainDesc.BufferDesc = backBufferDesc; swapChainDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; swapChainDesc.OutputWindow = hWnd; swapChainDesc.SampleDesc.Count = 1; swapChainDesc.Windowed = TRUE; IDXGISwapChain* swapChain = nullptr; hr = dxgiFactory->CreateSwapChain(commandQueue, &swapChainDesc, &swapChain); if (FAILED(hr)) return 1; // 创建渲染目标视图 ID3D12Resource* backBuffer = nullptr; hr = swapChain->GetBuffer(0, IID_PPV_ARGS(&backBuffer)); if (FAILED(hr)) return 1; D3D12_DESCRIPTOR_HEAP_DESC heapDesc = {}; heapDesc.NumDescriptors = 1; heapDesc.Type = D3D12_DESCRIPTOR_HEAP_TYPE_RTV; heapDesc.Flags = D3D12_DESCRIPTOR_HEAP_FLAG_NONE; ID3D12DescriptorHeap* rtvHeap = nullptr; hr = device->CreateDescriptorHeap(&heapDesc, IID_PPV_ARGS(&rtvHeap)); if (FAILED(hr)) return 1; CD3DX12_CPU_DESCRIPTOR_HANDLE rtvHandle(rtvHeap->GetCPUDescriptorHandleForHeapStart()); device->CreateRenderTargetView(backBuffer, nullptr, rtvHandle); // 渲染循环 MSG msg = {}; while (msg.message != WM_QUIT) { if (PeekMessage(&msg, nullptr, 0, 0, PM_REMOVE)) { TranslateMessage(&msg); DispatchMessage(&msg); } else { // 清除后台缓冲区 float clearColor[] = { 0.0f, 0.2f, 0.4f, 1.0f }; commandList->ClearRenderTargetView(rtvHandle, clearColor, 0, nullptr); // 切换后台缓冲区 hr = swapChain->Present(1, 0); if (FAILED(hr)) return 1; } } return 0; } ``` 这段代码创建了一个包含一个后台缓冲区的窗口,并在该缓冲区内清除颜色并显示它。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值