【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
- 【D3D11】 第01讲 初始化Direct3D
- 初始化Direct3D
- 初始化Direct3D
- 初始化Direct3D
- 初始化Direct3D
- Direct3D 初始化
- Direct3D 初始化
- Direct3D初始化
- 初始化Direct3D
- Direct3D初始化
- 初始化Direct3D
- D3D11基础教程二之D3D11初始化
- DirectX 11游戏编程学习笔记之5: 第4章Direct3D Initialization(Direct3D初始化)
- 第一章:Direct3D的初始化
- 初始化Direct3D窗口
- Direct3D的初始化
- Direct3D的初始化
- Direct3D的初始化
- VC++的一个奇怪的C2732错误
- UVALive 5876 - Writings on the Wall 【KMP】
- mac机os系统下安装和运行xampp经常遇到的几个小问题!(已解决)
- 远程桌面映射本地硬盘
- 省市区三级联动
- 【D3D11】 第01讲 初始化Direct3D
- session讲解
- 第1章 Android Dalvik 配置实战
- #HDU 1548 A strange lift 【BFS】
- beanutils的一个小问题
- C语言知识点汇总(未完成)
- CodeForces 46B T-shirts from Sponsor
- 碰撞检测之Ray-Box检测
- ubuntu14.10系统_apt-get_update失败解决办法