在使用一个东西之前,我们需要初始化他,好比汽车加油,手机充电。于是我们采取平时的编码习惯,试图写下如下代码

        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. 在后台缓存中进行绘制
  2. 提交后台缓存的内容
  3. 回到步骤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 初始化的更多相关文章

  1. Direct3D11学习:(三)Direct3D11初始化

    转载请注明出处:http://www.cnblogs.com/Ray1024 一.概述 做完一系列的准备工作之后,我们就正式进入Direct3D11的学习了.我们就从Direct3D11的初始化工作开 ...

  2. Direct3D11学习:(七)绘图基础——彩色立方体的绘制

    转载请注明出处:http://www.cnblogs.com/Ray1024 一.概述 在前面的几篇文章中,我们详细介绍了Direct3D渲染所需要的数学基础和渲染管道理论知识.从这篇文章开始,我们就 ...

  3. Direct3D11学习:(五)演示程序框架

    转载请注明出处:http://www.cnblogs.com/Ray1024 一.概述 在此系列最开始的文章Direct3D11学习:(一)开发环境配置中,我们运行了一个例子BoxDemo,看过这个例 ...

  4. Direct3D11学习:(二)基本绘图概念和基本类型

    转载请注明出处:http://www.cnblogs.com/Ray1024   一.概述 在正式开始学习D3D11之前,我们必需首先学习必要的基础知识. 在这篇文章中,我们将介绍一下Direct3D ...

  5. 2018-10-20-C#-从零开始写-SharpDx-应用-初始化dx修改颜色

    title author date CreateTime categories C# 从零开始写 SharpDx 应用 初始化dx修改颜色 lindexi 2018-10-20 17:34:37 +0 ...

  6. C# 从零开始写 SharpDx 应用 初始化dx修改颜色

    原文:C# 从零开始写 SharpDx 应用 初始化dx修改颜色 版权声明:博客已迁移到 https://blog.lindexi.com 欢迎访问.如果当前博客图片看不到,请到 https://bl ...

  7. SharpDX初学者教程第3部分:初始化DirectX

    原文 http://www.johanfalk.eu/blog/sharpdx-beginners-tutorial-part-3-initializing-directx 在这部分中,我们将初始化D ...

  8. Java初始化过程

    这篇文章主要讲解Java在创建对象的时候,初始化的顺序.主要从以下几个例子中讲解: 继承关系中初始化顺序 初始化块与构造器的顺序 已经加载过的类的初始化顺序 加载父类,会不会加载子类 创建子类对象会不 ...

  9. nginx源码分析之模块初始化

    在nginx启动过程中,模块的初始化是整个启动过程中的重要部分,而且了解了模块初始化的过程对应后面具体分析各个模块会有事半功倍的效果.在我看来,分析源码来了解模块的初始化是最直接不过的了,所以下面主要 ...

随机推荐

  1. 深入理解jQuery插件开发(转)

    转自:http://blog.jobbole.com/30550/ 如果你看到这篇文章,我确信你毫无疑问会认为jQuery是一个使用简便的库.jQuery可能使用起来很简单,但是它仍然有一些奇怪的地方 ...

  2. javap 可以打印出用于jni调用的java函数的签名信息

    javap可以打印出java的字节码: -c     Prints out disassembled code, i.e., the instructions that comprise the Ja ...

  3. 第二百三十九天 how can I 坚持

    去看了个电影,消失的凶手,乐视会员送的电影票,有点虐心,不过看着感觉还挺不错. 下了班就去看了,也没有吃饭,不过没感觉到饿,回来吃了份泡面,还喝了袋冰凉的酸奶,现在已经感觉肚子有点疼了,哎.. 哲学是 ...

  4. Maven学习总结(一)——Maven入门

    原博文出自于:http://www.cnblogs.com/xdp-gacl/p/3498271.html 感谢! 一.Maven的基本概念 Maven(翻译为"专家"," ...

  5. MySQL索引的创建,查看,删除

    在执行CREATE TABLE语句时可以创建索引,也可以单独用CREATE INDEX或ALTER TABLE来为表增加索引. 1.ALTER TABLE ALTER TABLE用来创建普通索引.UN ...

  6. 你应该知道的16个Linux服务器监控命令

    在不同的Linux发行版中,会有不同的GUI程序可以显示各种系统信息,比如SUSE Linux发行版中,就有非常棒的图形化的配置和管理工具YaST,KDE桌面环境里的KDE System Guard也 ...

  7. 最大流&最小割 - 专题练习

    [例1][hdu5889] - 算法结合(BFS+Dinic) 题意 \(N\)个点\(M\)条路径,每条路径长度为\(1\),敌人从\(M\)节点点要进攻\(1\)节点,敌人总是选择最优路径即最短路 ...

  8. spark结合 Openfire服务器,发送聊天消息

    1.下载OpenFire服务器,进行安装,参考http://www.cnblogs.com/hoojo/archive/2012/05/17/2506769.html 2.程序运行客户端:下载客户端代 ...

  9. Hadoop本地库

    目的 鉴于性能问题以及某些Java类库的缺失,对于某些组件,Hadoop提供了自己的本地实现. 这些组件保存在Hadoop的一个独立的动态链接的库里.这个库在*nix平台上叫libhadoop.so. ...

  10. ORACLE表坏块处理

    1.对于普通表,可以考虑使用事件方式处理 事件10231:设置在全表扫描时忽略损坏的数据块 ALTER SYSTEM SET EVENTS='10231 trace name context fore ...