总体来说可以概括为以下几个步骤:

  1. 创建Device和Context
  2. 创建SwapChain
  3. 为BackBuffer创建View
  4. 创建Depth/Stencil Buffer,并为之创建View
  5. 将View绑定到Context中
  6. 设置Viewport

创建Device和Context

HRESULT D3D11CreateDevice(
IDXGIAdapter *pAdapter,
D3D_DRIVER_TYPE DriverType,
HMODULE Software,
UINT Flags,
const D3D_FEATURE_LEVEL *pFeatureLevels,
UINT FeatureLevels,
UINT SDKVersion,
ID3D11Device **ppDevice,
D3D_FEATURE_LEVEL *pFeatureLevel,
ID3D11DeviceContext **ppImmediateContext
);

主要调用D3D11CreateDevice创建ID3D11Device和ID3D11DeviceContext。接口说明可以查看API文档。这里注意第四个参数Flags。在Windows10系统下,如果要设置为D3D11_CREATE_DEVICE_DEBUG,则必须安装DirectX Graphics Tools。参见

创建SwapChain

HRESULT CreateSwapChain(
IUnknown *pDevice,
DXGI_SWAP_CHAIN_DESC *pDesc,
IDXGISwapChain **ppSwapChain
);

主要调用IDXGIFactory::CreateSwapChain创建IDXGISwapChain。接口说明可以查看API文档。我们通过上一步创建的ID3D11Device来获得IDXGIFactory:参见

IDXGIDevice * pDXGIDevice = nullptr;
hr = g_pd3dDevice->QueryInterface(__uuidof(IDXGIDevice), (void **)&pDXGIDevice); IDXGIAdapter * pDXGIAdapter = nullptr;
hr = pDXGIDevice->GetAdapter( &pDXGIAdapter ); IDXGIFactory * pIDXGIFactory = nullptr;
pDXGIAdapter->GetParent(__uuidof(IDXGIFactory), (void **)&pIDXGIFactory);

其实,我们也可以直接调用D3D11CreateDeviceAndSwapChain同时创建Device和SwapChain,但是DXGI_SWAP_CHAIN_DESC结构中包含Multisample相关字段,而在Device创建之前,是无法通过ID3D11Device::CheckMultisampleQualityLevels获取到正确值的。

为BackBuffer创建View

创建SwapChain的时候BackBuffer已经自动创建好了,我们只需做的是为它创建一个View。

HRESULT CreateRenderTargetView(
ID3D11Resource *pResource,
const D3D11_RENDER_TARGET_VIEW_DESC *pDesc,
ID3D11RenderTargetView **ppRTView
);

View的用处其实就是用来指定的Buffer的用法,这样同一块Buffer可以多次复用。一个Buffer可以对应多个View。

创建Depth/Stencil Buffer,并为之创建View

HRESULT CreateTexture2D(
const D3D11_TEXTURE2D_DESC *pDesc,
const D3D11_SUBRESOURCE_DATA *pInitialData,
ID3D11Texture2D **ppTexture2D
);
HRESULT CreateDepthStencilView(
ID3D11Resource *pResource,
const D3D11_DEPTH_STENCIL_VIEW_DESC *pDesc,
ID3D11DepthStencilView **ppDepthStencilView
);

首先通过ID3D11Device::CreateTexture2D创建出Buffer,然后调用ID3D11Device::CreateDepthStencilView创建View。值得注意的是,D3D11_TEXTURE2D_DESC结构中的Usage字段:参见

Resource Usage Default Dynamic Immutable Staging
GPU-Read yes yes yes yes
GPU-Write yes yes
CPU-Read yes
CPU-Write yes yes

将View绑定到Context中

void OMSetRenderTargets(
UINT NumViews,
ID3D11RenderTargetView * const *ppRenderTargetViews,
ID3D11DepthStencilView *pDepthStencilView
);

ID3D11DeviceContext负责绑定View。

设置Viewport

void RSSetViewports(
UINT NumViewports,
const D3D11_VIEWPORT *pViewports
);

ID3D11DeviceContext负责设置Viewport。

最新文章

  1. Node.js:path、url、querystring模块
  2. 使用JMeter进行简单的压力测试
  3. 360个人图书馆 轻松解除网页防复制 (转自老D)
  4. Android调用WCF
  5. jQuery框架的简单使用(H5)
  6. JAVABEAN EJB POJO区别
  7. 【转】memcached工作原理介绍
  8. 转:初学者,手工注入测试方法小节 (出处:: 51Testing软件测试网--jie)
  9. JAVA 中URL链接中文参数乱码的若干处理方法
  10. 相对路径与绝对路径构造file对象
  11. Selenium2(java)selenium常用API 五
  12. 仿QQ空间和微信朋友圈,高解耦高复用高灵活
  13. .net c#将数据库数据对象转换为实体值对象
  14. H5获取原生传过来的值
  15. nginx server_name匹配顺序
  16. 一个网工的Linux学习过程
  17. MVC,重写AuthorizeAttribute实现自己的权限验证(一)
  18. Linux C 数据结构->双向链表(阴阳在六,何以言九~)
  19. 生成Excel
  20. IntelliJ IDEA 创建maven项目一次后,然后删除,再次保存到此目录下,提供此目录已经被占用的问题。

热门文章

  1. 深度分析:Java多线程,线程安全,并发包
  2. 无论PC还是Mac,都能畅快地使用移动硬盘
  3. [java基础]复习 java三大特性,异常,接口,String
  4. Java(8)I/O
  5. python3 Redis未授权检测脚本
  6. Ajax Status(状态码) & readyState()
  7. Android多触点总结
  8. JZOJ2020年8月11日提高组T2 宝石
  9. vue+element ctrl+s保存写法
  10. 第8.6节 Python类中的__new__方法深入剖析:调用父类__new__方法参数的困惑