Direct3D11-1 初始化
在使用一个东西之前,我们需要初始化他,好比汽车加油,手机充电。于是我们采取平时的编码习惯,试图写下如下代码
Direct3D11 _direct3d11;
事实上,我们不能这样初始化Direct3D11,我们需要创建设备,一个用来执行Direct3D API的设备。
一个Direct3D设备负责资源管理,渲染,显卡交互,在11中,这个设备被拆成两部分:
device 资源创建
devicecontext 执行渲染
在使用Direct3D11之前,首先要创建两个接口(对象)ID3D11Device * ,ID3D11DeviceContext *(为什么是指针,请自行搜索COM),鉴于这两者实际上是一体的,所以一条API即可完成我们的目的 :    http://msdn.microsoft.com/en-us/library/windows/desktop/ff476082(v=vs.85).aspx
HRESULT
				WINAPI D3D11CreateDevice(
__in_opt
					IDXGIAdapter* pAdapter,
D3D_DRIVER_TYPE DriverType,
HMODULE Software,
UINT Flags,
CONST
					D3D_FEATURE_LEVEL* pFeatureLevels,
UINT FeatureLevels,
UINT SDKVersion,
__out_opt
					ID3D11Device** ppDevice,
__out_opt
					D3D_FEATURE_LEVEL* pFeatureLevel,
__out_opt
				ID3D11DeviceContext** ppImmediateContext
);
第一个参数要求是一个指针指向video adapter,但是我们并没有获得这样一个指针。于是我们将这个参数设为nullptr,API就会从默认显卡来创建Device和DeviceContext
第二个参数要求指明D3D工作在硬件上还是软件上,由于我们第一个参数指的是默然显卡,所以 DriverType
			=
		D3D_DRIVER_TYPE_HARDWARE
第三个参数显然为0,第四个参数取决你的代码是Release还是Debug,明显的。我们是在Debug模式下(这个模式能提示大量的调用错误) Flags
			=
			D3D11_CREATE_DEVICE_DEBUG
(升级到win8.1,VS2012下不能使用该flags)
SDKVersion = D3D11_SDK_VERSION。后三个参数是用来输出的,值得注意的是pFeatureLevel,这个参数用来接受Device的特性级别,比如你的默认显卡到底支持DX的那个版本,他们分别是一下可能
enum
				D3D_FEATURE_LEVEL
{ D3D_FEATURE_LEVEL_9_1 = 0x9100,
D3D_FEATURE_LEVEL_9_2 = 0x9200,
D3D_FEATURE_LEVEL_9_3 = 0x9300,
D3D_FEATURE_LEVEL_10_0 = 0xa000,
D3D_FEATURE_LEVEL_10_1 = 0xa100,
D3D_FEATURE_LEVEL_11_0 = 0xb000
} D3D_FEATURE_LEVEL;
(与之pFeatureLevels对应的是CONST
					D3D_FEATURE_LEVEL* pFeatureLevels UINT FeatureLevels,这两个参数告诉需要测试的特性,如果为0,这表示测试所有特性。然后把最大能支持的特性返回到pFeatureLevels里面)
不要小看这个Feature_Level,他机智的解决了一个游戏编程面对不同硬件的问题,游戏开发人员不能保证这条API是否被显卡支持,在以前的Direct3D编程中,你会看到繁重的设备枚举(检测每块图形卡的性能)。当然设备枚举不止这么简单,但是开发人员得到了保证,
"如果这显卡支持DX11,那么他就支持DX11的所有特性"
妈妈再也不用担心对方的显卡不支持而直接崩掉了。最后的代码看起来像这样
UINT createDeviceFlags = 0;
#if
				defined(DEBUG) || defined(_DEBUG)
createDeviceFlags |= D3D11_CREATE_DEVICE_DEBUG;
D3D11CreateDevice(
nullptr, // default adapter
D3D_DRIVER_TYPE_HARDWARE,
nullptr, // no software device
createDeviceFlags,
0,0, // default feature level array
D3D11_SDK_VERSION,
&md3dDevice,
&featureLevel,
&md3dImmediateContext
);
创建好设备并不意味着收工大吉,我们还有其他工作要做,比如说,Direct3D渲染到哪里去,我们需要为期提供一个buff。为了生成更加平滑的动画。在DirectX中,使用了交换链和页面置换技术。我们总是
Draw到离屏的buff里面,然后置换两个buff,绘制到屏幕。程序结构就像这样子:
- 在后台缓存中进行绘制
- 提交后台缓存的内容
- 回到步骤1
唔,这意味着我们需要创建交换链,代码如下:
DXGI_SWAP_CHAIN_DESC sd; //用来描述交换链的一些属性
sd.BufferDesc.Width = mClientWidth; //宽度和高度
sd.BufferDesc.Height = mClientHeight;
sd.BufferDesc.RefreshRate.Numerator = 60; //刷新HZ
sd.BufferDesc.RefreshRate.Denominator = 1;
sd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; //像素格式
sd.BufferDesc.ScanlineOrdering = DXGI_MODE_SCANLINE_ORDER_UNSPECIFIED;
sd.BufferDesc.Scaling = DXGI_MODE_SCALING_UNSPECIFIED;
sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; //作为渲染目标
sd.BufferCount = 1;
sd.OutputWindow = mhMainWnd;
sd.Windowed = true;
sd.SwapEffect = DXGI_SWAP_EFFECT_DISCARD;
sd.Flags = 0;
IDXGIDevice* dxgiDevice = 0;
HR(md3dDevice->QueryInterface(__uuidof(IDXGIDevice), (void**)&dxgiDevice));
//接口取得,参见COM
IDXGIAdapter* dxgiAdapter = 0;
HR(dxgiDevice->GetParent(__uuidof(IDXGIAdapter), (void**)&dxgiAdapter));
IDXGIFactory * dxgiFactory = 0;
HR(dxgiAdapter->GetParent(__uuidof(IDXGIFactory), (void**)&dxgiFactory));
HR(dxgiFactory->CreateSwapChain(md3dDevice, &sd, &mSwapChain));
接下来我会放出一个demo教程,这个教程没有创建交换链,但是有简易的显卡枚举和与显卡进行交互的内容,并且引入了HLSL代码
Direct3D11-1 初始化的更多相关文章
- Direct3D11学习:(三)Direct3D11初始化
		转载请注明出处:http://www.cnblogs.com/Ray1024 一.概述 做完一系列的准备工作之后,我们就正式进入Direct3D11的学习了.我们就从Direct3D11的初始化工作开 ... 
- Direct3D11学习:(七)绘图基础——彩色立方体的绘制
		转载请注明出处:http://www.cnblogs.com/Ray1024 一.概述 在前面的几篇文章中,我们详细介绍了Direct3D渲染所需要的数学基础和渲染管道理论知识.从这篇文章开始,我们就 ... 
- Direct3D11学习:(五)演示程序框架
		转载请注明出处:http://www.cnblogs.com/Ray1024 一.概述 在此系列最开始的文章Direct3D11学习:(一)开发环境配置中,我们运行了一个例子BoxDemo,看过这个例 ... 
- Direct3D11学习:(二)基本绘图概念和基本类型
		转载请注明出处:http://www.cnblogs.com/Ray1024 一.概述 在正式开始学习D3D11之前,我们必需首先学习必要的基础知识. 在这篇文章中,我们将介绍一下Direct3D ... 
- 2018-10-20-C#-从零开始写-SharpDx-应用-初始化dx修改颜色
		title author date CreateTime categories C# 从零开始写 SharpDx 应用 初始化dx修改颜色 lindexi 2018-10-20 17:34:37 +0 ... 
- C# 从零开始写 SharpDx 应用 初始化dx修改颜色
		原文:C# 从零开始写 SharpDx 应用 初始化dx修改颜色 版权声明:博客已迁移到 https://blog.lindexi.com 欢迎访问.如果当前博客图片看不到,请到 https://bl ... 
- SharpDX初学者教程第3部分:初始化DirectX
		原文 http://www.johanfalk.eu/blog/sharpdx-beginners-tutorial-part-3-initializing-directx 在这部分中,我们将初始化D ... 
- Java初始化过程
		这篇文章主要讲解Java在创建对象的时候,初始化的顺序.主要从以下几个例子中讲解: 继承关系中初始化顺序 初始化块与构造器的顺序 已经加载过的类的初始化顺序 加载父类,会不会加载子类 创建子类对象会不 ... 
- nginx源码分析之模块初始化
		在nginx启动过程中,模块的初始化是整个启动过程中的重要部分,而且了解了模块初始化的过程对应后面具体分析各个模块会有事半功倍的效果.在我看来,分析源码来了解模块的初始化是最直接不过的了,所以下面主要 ... 
随机推荐
- 线段和矩形相交 POJ 1410
			// 线段和矩形相交 POJ 1410 // #include <bits/stdc++.h> #include <iostream> #include <cstdio& ... 
- UVALive 4763
			一开始,没敢写,感觉会超时...其实就是暴力搜索.DFS #include<iostream> #include<stdio.h> #include<string.h&g ... 
- C++ 之高效使用STL ( STL 算法分类)
			http://blog.csdn.net/zhoukuo1981/article/details/3452118 
- PHP+Apache+MySQL+phpMyAdmin在win7系统下的环境配置
			配置方法在网上可以搜到很多,一步步来就好了,但是由于步骤比较多,需要耐心仔细一点点,这是我自己记录的成功步骤: 1.PHP+Apache+MySQL的安装:PHP网站开发 2.phpMyAdmin的配 ... 
- 自定义实现InputFormat、OutputFormat、输出到多个文件目录中去、hadoop1.x api写单词计数的例子、运行时接收命令行参数,代码例子
			一:自定义实现InputFormat *数据源来自于内存 *1.InputFormat是用于处理各种数据源的,下面是实现InputFormat,数据源是来自于内存. *1.1 在程序的job.setI ... 
- 解决oracle启动的错误: ORA-00119 ORA-00132
			$ sqlplus / as sysdbaSQL>create pfile fromspfile修改$ORACLE_HOME/dbs下的文件initDEV.ora中的*.local_listen ... 
- thymeleaf中的条件判断用法
			一.简单的条件:“if”和“unless” th:if用法实例: <table> <tr> <th>NAME</th> <th>PRICE& ... 
- Educational Codeforces Round 7 - E. Ants in Leaves
			题目链接:http://www.codeforces.com/contest/622/problem/E 题意是给你一棵树,1为根,每个叶子节点有一个蚂蚁,移动到一个邻接节点时间耗费为1,一个节点上不 ... 
- SimpleUrlHandlerMapping用法
			SimpleUrlHandlerMapping是Spring MVC中适用性最强的Handler Mapping类,允许明确指定URL模式和Handler的映射关系.有两种方式声明SimpleUrlH ... 
- DataSource , DataSink, DataSourceLoop
			Script assertion in login: 
