DirectX 11的初始化
总体来说可以概括为以下几个步骤:
- 创建Device和Context
- 创建SwapChain
- 为BackBuffer创建View
- 创建Depth/Stencil Buffer,并为之创建View
- 将View绑定到Context中
- 设置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。
DirectX 11的初始化的更多相关文章
- DX11 Without DirectX SDK--01 DirectX11初始化
回到 DirectX11--使用Windows SDK来进行开发 由于个人觉得龙书里面第4章提供的Direct3D 初始化项目封装得比较好,而且DirectX SDK Samples里面的初始化程序过 ...
- 用DirectX 11绘制一个Cube
之前一篇文章讲了如何初始化DirectX 11,现在在此基础上绘制一个Cube,总体可概括为以下几个步骤: 定义Cube顶点数据结构 创建Vertex Buffer和Index Buffer 编写应用 ...
- {转自MC}NVIDIA DirectX 11演示DEMO详解
http://tieba.baidu.com/p/1960826986 图形技术无论如何发展,最终都要落到实际的应用中才有效果.在个人电脑上,图形技术最大的用户除了显示UI和操作界面外,就是呈现美轮美 ...
- C++11 列表初始化
在我们实际编程中,我们经常会碰到变量初始化的问题,对于不同的变量初始化的手段多种多样,比如说对于一个数组我们可以使用 int arr[] = {1,2,3}的方式初始化,又比如对于一个简单的结构体: ...
- Introduction to 3D Game Programming with DirectX 11 翻译--开篇
Direct3D 11简介 Direct3D 11是一个渲染库,用于在Windows平台上使用现代图形硬件编写高性能3D图形应用程序.Direct3D是一个windows底层库,因为它的应用程序编程接 ...
- c++11——列表初始化
1. 使用列表初始化 在c++98/03中,对象的初始化方法有很多种,例如 int ar[3] = {1,2,3}; int arr[] = {1,2,3}; //普通数组 struct A{ int ...
- DirectX 11游戏编程学习笔记之1: 开场白
本文由哈利_蜘蛛侠原创,转载请注明出处.有问题欢迎联系2024958085@qq.com 这是我之前的博客系列"DirectX9.0c游戏开发手记之'龙书'第二版学习笔记 ...
- DirectX* 11 多线程渲染的性能、方法和实践
对于在 CPU 上运行的 PC 游戏,渲染通常是主要的性能瓶颈:多线程渲染是一种消除瓶颈的有效方法.本文研究了 DirectX* 11 多线程渲染的性能可扩展性,讨论了多线程渲染的两种基本方法,并介绍 ...
- 最简化的DirectX 11开发环境的配置 VS2010
转载自:http://blog.csdn.net/zhmxy555/article/details/7672101 在编写基于DirectX 11的应用程序之前,我们当然需要在IDE中加入Direct ...
随机推荐
- PDF文档工具:pdfFactory快照功能详解
pdfFactory的快照功能,是通过一种类似截图的方式,将文档中的内容,如标题.图片.段落.文字等进行剪切的功能.剪切后的内容会转化为文本框的形式,我们可以对其进行加边框.旋转等编辑处理,但不能对其 ...
- Word文档数据被误删了怎么办,还能恢复吗
很多时候由于时间紧张或者是思路不想被打断,我们在编辑Word时不能及时的手动保存,一旦遇到电脑意外断电的情况可能就会导致编辑好的Word文档内容丢失.或者是文档编辑好了之后,Word提示是否保存时,误 ...
- MySQL常用命令与语句
目录 Shell命令 查看系统信息 查看系统变量 设置系统变量 数据库操作 查看表信息 修改表语句 操作表 操作索引 操作约束 操作列 查询常用语句 Shell命令 mysql -uroot -p12 ...
- 永别了,Dota2!
永别了,Dota2 .输了游戏,我还有人生! 游戏中,总有那些喷子,自己玩的不好,经常说人家! 和大便打架,即使赢了,身上也非常臭! 所以对于这种人,敬而远之即可!不吵不闹,默默把锅扛起!赢了,就好说 ...
- 为什么学完C语言觉得好像没学一般?
不少同学从Hello world学到文件操作之后,回顾感觉会又不会? 学会了又感觉没学会?这种不踏实.模糊虚无的感觉? 原因在于编程不同于理论学科,你听懂和理解了理论就可以运用. 比如历史地理,看 ...
- Kubernetes日志系统新贵Loki-Stack
Loki简介 Grafana Loki是可以组成功能齐全的日志记录堆栈的一组组件. 与其他日志记录系统不同,Loki是基于仅索引有关日志的元数据的想法而构建的:标签(就像Prometheus标签一样) ...
- rest-framework 响应器(渲染器)
一 作用: 根据 用户请求URL 或 用户可接受的类型,筛选出合适的 渲染组件. 用户请求URL: http://127.0.0.1:8000/test/?format=json http ...
- 卡耐基梅隆大学(CMU)元学习和元强化学习课程 | Elements of Meta-Learning
Goals for the lecture: Introduction & overview of the key methods and developments. [Good starti ...
- 树莓派自动连接WiFi
使用sudo raspi-config配置好第一个wifi 然后只需要修改一个文件sudo nano /etc/wpa_supplicant/wpa_supplicant.conf 内容如下: ctr ...
- argis android sdk配置备忘一下
ArcGIS RuntimeAndroid SDK100.1.0 1.在线配置(只有两处) 在project工程中的gradle添加 maven { url 'https://esri.bintray ...