【D3D11】 第01讲 初始化Direct3D

来源:互联网 发布:淘宝美工详情页套版 编辑:程序博客网 时间:2024/05/29 12:45

    因为项目的需要,所以花了一些时间学习D3D11,艰难的走通了API的核心流程。先聊点题外话,昨天和今天下午的时间都用在了看人机围棋的世纪之战上了,很久以前自娱自乐的做过初级的象棋AI,对这场对决就格外的关注,没想到AlphaGo目前的能力已经这么强大,表面上看AlphaGo的成功和图形行业没什么关系,实际上GPU并行计算发挥的作用是及其重要的,认真学好图形,有一天大家也可以参与到类似的项目中去。

    本讲主要理解一下Direct3D的初始化流程,跟着步骤一步一步做下来,当你看到下面的示意图时,说明你已经基本完成了初始化的工作

      

  开始之前,到这里下载D3D的SDK文档->http://pan.baidu.com/s/1jGOvgwQ

  文档可以方便API的查阅,以及很多重要的说明。

  初始化分成五步,读者可以自行参考Ogre的D3D11RenderSystem:

        Step1 - 初始化设备,创建设备,创建立即执行上下文

IDXGIFactory1* m_pDXGIFactory;HRESULT hr = CreateDXGIFactory1(__uuidof(IDXGIFactory1), (void**)&m_pDXGIFactory);if (FAILED(hr)){LOGERROR("D3D11RenderSystem::InitRenderSystem CreateDXGIFactory1");return ;}
IDXGIAdapter1* pDXGIAdapter(0);HRESULT hr = pDXGIFactory->EnumAdapters1(iAdapter, &pDXGIAdapter);if (DXGI_ERROR_NOT_FOUND == hr){return ;}if (FAILED(hr)){SAFE_RELEASE(pDXGIAdapter);return;}
D3D_FEATURE_LEVEL requestedLevels[] = {D3D_FEATURE_LEVEL_11_1,D3D_FEATURE_LEVEL_11_0,D3D_FEATURE_LEVEL_10_1,D3D_FEATURE_LEVEL_10_0,D3D_FEATURE_LEVEL_9_3,D3D_FEATURE_LEVEL_9_2,D3D_FEATURE_LEVEL_9_1};UINT numFeatureLevels = sizeof(requestedLevels) / sizeof(D3D_FEATURE_LEVEL);//ID3D11Device* pDevice(0);D3D_FEATURE_LEVEL FirstFL;ID3D11DeviceContext* pImmediateContext(0);HRESULT hr = D3D11CreateDevice(dynamic_cast<IDXGIAdapter*>(pDXGIAdapter),D3D_DRIVER_TYPE_UNKNOWN,//D3D_DRIVER_TYPE_HARDWARE,NULL,D3D11_CREATE_DEVICE_SINGLETHREADED | D3D11_CREATE_DEVICE_DEBUG,requestedLevels,numFeatureLevels,D3D11_SDK_VERSION,&pDevice,&FirstFL,&pImmediateContext);if (FAILED(hr)){LOGERROR("D3D11RenderSystem::CreateD3D11Device Failed to create device");SAFE_RELEASE(pDevice);SAFE_RELEASE(pImmediateContext);return 0;}


        Step2:描述交换链,创建交换链

IDXGIDevice1* pDXGIDevice = QueryDxgiDevice();//ZeroMemory(&m_SwapChainDesc, sizeof(DXGI_SWAP_CHAIN_DESC));m_SwapChainDesc.BufferDesc.Width = m_iWidth;m_SwapChainDesc.BufferDesc.Height = m_iHeight;m_SwapChainDesc.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;m_SwapChainDesc.BufferDesc.RefreshRate.Numerator = 60;m_SwapChainDesc.BufferDesc.RefreshRate.Denominator = 1;m_SwapChainDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;m_SwapChainDesc.OutputWindow = m_hWnd == NULL ? m_hExternalWnd : m_hWnd;m_SwapChainDesc.SampleDesc.Count = 1;m_SwapChainDesc.SampleDesc.Quality = 0;m_SwapChainDesc.Windowed = TRUE;m_SwapChainDesc.BufferCount = 1;m_SwapChainDesc.SwapEffect = DXGI_SWAP_EFFECT_DISCARD;m_SwapChainDesc.Flags = DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH;//create HRESULT hr = m_pDXGIFactory->CreateSwapChain(pDXGIDevice, &m_SwapChainDesc, &m_pSwapChain);if (FAILED(hr)){LOGERROR("D3D11RenderWindow::CreateSwapChain failed to create swap chain");SAFE_RELEASE(m_pSwapChain);}SAFE_RELEASE(pDXGIDevice);

        Step3:创建并绑定渲染目标视图

SAFE_RELEASE(m_pBackBuffer);//HRESULT hr = S_OK;//hr = m_pSwapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), (LPVOID*)&m_pBackBuffer);if (FAILED(hr)){LOGERROR("D3D11RenderWindow::CreateSizeDependedD3DResources Failed to create BackBuffer");return;}// get the backbuffer descD3D11_TEXTURE2D_DESC BBDesc;m_pBackBuffer->GetDesc(&BBDesc);D3D11_RENDER_TARGET_VIEW_DESC RTVDesc;ZeroMemory(&RTVDesc, sizeof(D3D11_RENDER_TARGET_VIEW_DESC));RTVDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;RTVDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2D;hr = m_Device->CreateRenderTargetView(m_pBackBuffer, &RTVDesc, &m_pRenderTargetView);if (FAILED(hr)){LOGERROR("D3D11RenderWindow::CreateSizeDependedD3DResources Failed to create RenderTargetView");return ;}
m_Device.GetImmediateContext()->OMSetRenderTargets(1, &m_pRenderTargetView, NULL);

        Step4:创建视口

D3D11_VIEWPORT vpInfo;vpInfo.Width = (FLOAT)w;vpInfo.Height = (FLOAT)h;vpInfo.MinDepth = 0.f;vpInfo.MaxDepth = 1.f;vpInfo.TopLeftX = (FLOAT)x;vpInfo.TopLeftY = (FLOAT)y;m_Device.GetImmediateContext()->RSSetViewports(1, &vpInfo);

        Step5:清空RenderTargetView,并Present

float ClearColor[4] = { 0.3f, 0.4f, 0.2f, 1.f };ID3D11RenderTargetView* pRTView(0);pRTView = m_pRenderTargetView;m_Device.GetImmediateContext()->ClearRenderTargetView(pRTView, ClearColor); 
m_pSwapChain->Present(1, 0);

    经过以上五步,如果正常,说明已经正确初始化完成,具体API的说明读者自行参考SDK文档。

                                                         

0 0