- 浏览: 13399 次
最新评论
C++Directx11开发笔记二:Direct3D基础设备的初始化
- 博客分类:
- 技术杂绘
C++Directx11开发笔记二:Direct3D基础设备的初始化
2011年07月15日
最近正在学习Directx 11的开发,上一次记录了Win32应用程序的基础,主要是注册窗体类,加载图标和鼠标,处理事件循环等,链接为:C++Directx11开发笔记一:Win32应用程序窗体创建。今天我们要介绍的是Direct3D基础,其中包括Direct3D 11的设备初始化等等来初步认识Direct3D这个神秘的面纱。由于要用到Directx11所以需要在项目中引入一些库,为了便于后面操作,这里列举了所需要的常见的库名称:d3d11.lib(d3d11d.lib调试下),d3dcompiler.lib(HLSL编译器,HLSL开发一:语言基础),dxerr.lib(错误库),dxguid.lib(这个库定义了Direct3D中所需要的GUID,即COM需要引用的,由于Directx是一个COM组建哦,所以如果不引入会出现问题的哦)。以上这些就是常见的Direct3D在C++编程中需要引入的库,可以在解决方案中的链接输入中引入,这个是C++基础这里就不多说了哦。
设备(Device):即是用于创建资源和计算显示接口性能的东东,大家知道这个东东和显卡有关系,不一样的显卡支持的也有所不同,在Direct3D中使用ID3D11Device【注:在Direct3D 11中的命名都是以D3D11开头,其中I表示接口的意思】接口来表示。每个应用程序必须有最少一个设备实例,即依赖于你机子上安装的显卡设备。ID3D11Device由D3D11CreateDevice或D3D11CreateDeviceAndSwapChain来创建,当然指定那个驱动程序,Direct3D是直接和驱动打交道的,如果硬件不支持,Direct3D将会虚拟(即通过软件)而得到支持。就需要D3D_DRIVER_TYPE来指定,具体代码可以在D3Dcommon.h中找到,代码如下: 1 typedef
2 enum D3D_DRIVER_TYPE
3 { D3D_DRIVER_TYPE_UNKNOWN = 0,
4 D3D_DRIVER_TYPE_HARDWARE = ( D3D_DRIVER_TYPE_UNKNOWN + 1 ) ,
5 D3D_DRIVER_TYPE_REFERENCE = ( D3D_DRIVER_TYPE_HARDWARE + 1 ) ,
6 D3D_DRIVER_TYPE_NULL = ( D3D_DRIVER_TYPE_REFERENCE + 1 ) ,
7 D3D_DRIVER_TYPE_SOFTWARE = ( D3D_DRIVER_TYPE_NULL + 1 ) ,
8 D3D_DRIVER_TYPE_WARP = ( D3D_DRIVER_TYPE_SOFTWARE + 1 )
9 } D3D_DRIVER_TYPE;
其中: D3D_DRIVER_TYPE_UNKNOWN:未知驱动类型;
D3D_DRIVER_TYPE_HARDWARE:硬件驱动类型,这个是性能最好的,因为得到硬件显卡的支持,可以使用硬件加速器,可以在主程序中使用这个类型,但是也有些管道不支持硬件需要软件的支持(即显卡不可能支持Directx11中所有的东东,不过可以使用软件驱动类型来帮忙)。这种类型的驱动主要应用于HAL(Hardware Abstraction Layer),美其名曰硬件抽象层;
D3D_DRIVER_TYPE_REFERENCE:引用驱动类型,这个支持所有Direct3D接口,因为这个驱动通过DirectX SDK进行安装。这个设计主要是为了进行测试,检验性能,调试以及验证BUG等而存活的;
D3D_DRIVER_TYPE_NULL:空驱动类型,这个主要是用来调试没有呈现的APIs调用,即不需要显示,这个驱动也是有DirectX SDK进行安装;
D3D_DRIVER_TYPE_SOFTWARE:软件驱动类型,这个类型的驱动完全有软件模拟来实现Direct3D,性能比较差,但是有时候显卡不支持的情况下需要这个来完成进行模拟;
D3D_DRIVER_TYPE_WARP:WARP驱动类型,是一个性能强的软件光栅化器,这个光栅化器支持9_1到10.1版本,具有比较强的性能,【注:这个比较难理解,以后可能会专门研究一下!】
在上面提到的9_x等应该就是DirectX的版本,我们学习的当然是11_0,这个在编程中也有一个枚举,具体代码如下,估计以后的12,13出来也会加到SDK中。 typedef
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;
DirectX SDK中支持DirectX 9.x和DirectX 10.x以及我们学习的DirectX 11,根据市面上的显卡基本可以支持DirectX10了,所以我们可以在代码中定义一下可能用到的驱动类型和SDK支持版本等级(这个定义是为了可以迭代进行解决一些麻烦,这个和网页AJAX编程中创建REQUEST一样,因为各个浏览器支持的XML东东是不一样的),代码如下: 1 D3D_DRIVER_TYPE driverTypes[] =
2 {
3 D3D_DRIVER_TYPE_HARDWARE,
4 D3D_DRIVER_TYPE_WARP,
5 D3D_DRIVER_TYPE_REFERENCE,
6 };
7 UINT numDriverTypes = ARRAYSIZE( driverTypes );
8
9 D3D_FEATURE_LEVEL featureLevels[] =
10 {
11 D3D_FEATURE_LEVEL_11_0,
12 D3D_FEATURE_LEVEL_10_1,
13 D3D_FEATURE_LEVEL_10_0,
14 };
15 UINT numFeatureLevels = ARRAYSIZE( featureLevels );
设备上下文(Device Context):主要包括当前设备的环境以及一些设定信息【注:如果你是ASP.NET的开发人员,一定知道网页HTTP请求的上下文HttpContext吧】。设备上下文主要用于设置管道状态和通过所拥有的资源运行呈现命令。在Direct3D中包含了两种设备上下文,一种为立即呈现(显示)[Immediate Context],还有一种就是延迟显示[Deferred Context]。两种上下文都通过ID3D11DeviceContext接口来描述,下面我们分别看一下这两种的设备上下文信息。 ImmediateContext:立即呈现器直接和驱动打交道,每一个设备有且仅有一个立即显示设备上下文,他可以直接从GPU中检索得到数据。
DeferredContext:延迟显示主要用于多线程应用程序中,将GPU的命令添加到一个队列中,在单线程应用程序中是没有必要这么做的,直接显示就好了。使用延迟显示将不会继承立即呈现的状态信息,而是通过一个工作线程(worker thread)来呈现执行命令。
注意:在DirectX11中所有ID3D11Device以及ID3D11DeviceChild(包括它衍生出来的ID3D11Buffer,ID3D11Query等等)都是线程安全的。即多个线程可以同时调用它们,而不会出现冲突状态。但是设备上下文不一样,无论是那个设备上下文都可以工作在任何线程中,但是每一次只能有一个线程进行工作,因此如果需要在多线程中使用就需要记得“锁”和“解锁”。
初始化设备:
在创建设备以及设备上下文时我们还需要了解一个DXGI_SWAP_CHAIN_DESC结构体,应该叫做DXGI交换链描述信息,其具体结构代码如下: 1 typedef struct DXGI_SWAP_CHAIN_DESC
2 {
3 DXGI_MODE_DESC BufferDesc;
4 DXGI_SAMPLE_DESC SampleDesc;
5 DXGI_USAGE BufferUsage;
6 UINT BufferCount;
7 HWND OutputWindow;
8 BOOL Windowed;
9 DXGI_SWAP_EFFECT SwapEffect;
10 UINT Flags;
11 } DXGI_SWAP_CHAIN_DESC;
12 typedef struct DXGI_MODE_DESC
13 {
14 UINT Width;
15 UINT Height;
16 DXGI_RATIONAL RefreshRate;
17 DXGI_FORMAT Format;
18 DXGI_MODE_SCANLINE_ORDER ScanlineOrdering;
19 DXGI_MODE_SCALING Scaling;
20 } DXGI_MODE_DESC;
21
22 typedef struct DXGI_SAMPLE_DESC
23 {
24 UINT Count;
25 UINT Quality;
26 } DXGI_SAMPLE_DESC;
27 typedef
28 enum DXGI_SWAP_EFFECT
29 { DXGI_SWAP_EFFECT_DISCARD = 0,
30 DXGI_SWAP_EFFECT_SEQUENTIAL = 1
31 } DXGI_SWAP_EFFECT;
这个结构体的相关信息将在后面进行描述,因为这个属于DXGI范畴,我想也应该相应了解它们的具体情况(在我暂时学习的情况了解到学习DirectX11肯定要解决HLSL,DXGI等)。这里我们只要知道如何初始化即可,其代码如下: 1 DXGI_SWAP_CHAIN_DESC sd;
2 ZeroMemory( &sd, sizeof( sd ) );
3 sd.BufferCount = 1;
4 sd.BufferDesc.Width = width;
5 sd.BufferDesc.Height = height;
6 sd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
7 sd.BufferDesc.RefreshRate.Numerator = 60;
8 sd.BufferDesc.RefreshRate.Denominator = 1;
9 sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
10 sd.OutputWindow = g_hWnd;
11 sd.SampleDesc.Count = 1;
12 sd.SampleDesc.Quality = 0;
13 sd.Windowed = TRUE;
其中width和height表示窗口(游戏窗口)的宽和高,而g_hWnd表示窗体的句柄,60应该就是表示帧频率(FPS),即每秒显示60帧。这样就可以通过D3D11CreateDevice或D3D11CreateDeviceAndSwapChain来得到设备和设备上下文了,具体代码如下: 1 HINSTANCE g_hInst = NULL;
2 HWND g_hWnd = NULL;
3 D3D_DRIVER_TYPE g_driverType = D3D_DRIVER_TYPE_NULL;
4 D3D_FEATURE_LEVEL g_featureLevel = D3D_FEATURE_LEVEL_11_0;
5 ID3D11Device* g_pd3dDevice = NULL;
6 ID3D11DeviceContext* g_pImmediateContext = NULL;
7 IDXGISwapChain* g_pSwapChain = NULL;
8 ID3D11RenderTargetView* g_pRenderTargetView = NULL;
9 //上面为我们定义的一些全局变量,下面代码在初始化设备中进行调用
10 for( UINT driverTypeIndex = 0; driverTypeIndex GetBuffer( 0, __uuidof( ID3D11Texture2D ), ( LPVOID* )&pBackBuffer );
4 if( FAILED( hr ) )
5 return hr;
6
7 hr = g_pd3dDevice->CreateRenderTargetView( pBackBuffer, NULL, &g_pRenderTargetView );
8 pBackBuffer->Release();
9 if( FAILED( hr ) )
10 return hr;
11
12 g_pImmediateContext->OMSetRenderTargets( 1, &g_pRenderTargetView, NULL );
13
14 // Setup the viewport
15 D3D11_VIEWPORT vp;
16 vp.Width = (FLOAT)width;
17 vp.Height = (FLOAT)height;
18 vp.MinDepth = 0.0f;
19 vp.MaxDepth = 1.0f;
20 vp.TopLeftX = 0;
21 vp.TopLeftY = 0;
22 g_pImmediateContext->RSSetViewports( 1, &vp );
通过交换链来呈现图形,更复杂的程序等等将在后面跟着例子慢慢学习,希望这次我也可以系统的学习一下C++DirectX11编程。由于我学习C++是由.NET转过来的,以前也做了很多.NET项目,最近也有在弄MVC所以当中可能会涉及到一些.NET的影子。在最后要注意的是DirectX是COM,在使用后要记得Release就OK了。由于本人也是半路出家,程序都是自学的,所以难免有些错误,再加上英文又不好,希望各位博友能够批评指正,大家共同进步。
==================================================
本文可以随意转载,摘抄等非商业用途;
为了尊重作者成果,在转载和摘抄的时候请留下作者名称和出处;
关于作者:网魂小兵
熟悉程序:ASP.NET(C#), C/C++,JAVASCRIPT,SQLSERVER,MYSQL...
熟悉项目:CommunityServer,JQuery,Mangos
研发项目:秘密
发表评论
-
C#写的COM组件注册问题兼论微软Regasm注册的BUG
2012-07-03 13:43 3670有时间的话,我会 ... -
Flex style - CSS 的使用
2012-07-02 12:14 631Dan Orlando, 软件架 ... -
Flex与Javascript之间的交互
2012-07-02 12:14 508最近做的一个项目要用到Flex与Javascrip之间的交 ... -
Flex 拖拽范例
2012-07-02 12:14 603Flex由于在其Framwork里加入了DragDrop管 ... -
Adobe Flex UIComponent LifeCycle
2012-07-02 12:14 657Adobe Flex UIComponent L ... -
实现FLEX 通过AMF跟PHP通信
2012-07-01 09:48 571AMF flex一种远调用 ... -
Flex style - CSS 的使用
2012-07-01 09:48 639Dan Orlando, 软件架 ... -
flex+java整合开发
2012-07-01 09:48 536用Flash Builder 4 beta ... -
Flex学习笔记(1)
2012-07-01 09:48 7201.模块化Module 优点:主应用程序开始时不需马 ... -
[推荐]12-《PHP和MySQL web开发》第6章 面向对象的PHP 学习笔记
2012-06-30 16:11 637[推荐]12-《PHP和MySQL web开发》第6章 面向对 ... -
《移动应用的设计与开发》读书笔记
2012-06-30 16:11 1242《移动应用的设计与开 ... -
《高效程序员的45个习惯――敏捷开发修炼之道》 读书笔记(三)
2012-06-30 16:11 667《高效程序员的45个习 ... -
《敏捷软件开发(原则、模式与实践)》笔记
2012-06-30 16:11 773《敏捷软件开发(原则、 ...
相关推荐
源码配套博文 《【Visual C++】游戏开发笔记三十三 浅墨DirectX提高班之二 化腐朽为神奇:DirectX初始化四步曲 》 ,文章地址为 http://blog.csdn.net/zhmxy555/article/details/8197792, 点击debug下的exe文件...
源码的配套博文是 《【Visual C++】游戏开发笔记四十七 浅墨DirectX教程十五 翱翔于三维世界:摄像机的实现》 ,文章地址为http://blog.csdn.net/zhmxy555/article/details/8657656, 点击Debug下的exe文件可以...
源码的配套博文是 《【Visual C++】游戏开发笔记四十八 浅墨DirectX教程十六 三维地形系统的实现》 ,文章地址为http://blog.csdn.net/zhmxy555/article/details/8685546, 点击Release文件夹下的exe文件可以直接...
包括了Direct3D初始化,DirectInput输入处理,顶点缓存,光照与材质,文字输出,颜色,纹理贴图,四大变换,网格模型,X文件载入等等知识(当然还有默认被开启的深度缓存),以及地形系统模拟,三维天空模拟,粒子...
包括了Direct3D初始化,DirectInput输入处理,顶点缓存,光照与材质,文字输出,颜色,纹理贴图,四大变换,网格模型,X文件载入等等知识(当然还有默认被开启的深度缓存),以及地形系统模拟,三维天空模拟,粒子...
2.6.3 初始化direct3d 2.6.4 消息循环 2.6.5 渲染图形 2.6.6 结束direct3d程序 2.7 direct3d设备对象深入探讨 2.8 direct3d表面 2.9 小结 第3章 坐标系与基本图元 3.1 direct3d坐标系 3.2 direct3d基本图元 3.3 ...
包括了Direct3D初始化,DirectInput输入处理,顶点缓存,光照与材质,文字输出,颜色,纹理贴图,四大变换,网格模型,X文件载入等等知识(当然还有默认被开启的深度缓存),地形系统模拟,三维天空模拟。...
C++11 和 DX11 教程 ...教程 2 - 初始化 Direct3D 11 教程 3 - 帧缓冲 教程 4 - 创建顶点缓冲区 教程 5 - 创建和加载着色器 教程 6 - 输入布局和视口 第 3 章 - 2D 精灵,输入 第 4 章 - 3D、向量和矩阵
包括了Direct3D初始化,DirectInput输入处理,顶点缓存,文字输出,颜色,纹理贴图,四大变换,三维天空模拟,粒子系统等等知识。 另外,关于雪花粒子效果提醒大家一下,可在SnowParticleClass.h中的PARTICLE_...
主要内容包括软件Visual C++2005的开发技术、DirectSound开发音频、DirectShow/VFW开发视频、MMX/SSE进行多媒体汇编编程、DM642 DSP进行音视频算法优化和主流视频算法MPEG-4/H.264的编码原理及工程实践。本书系统地...
主要内容包括软件Visual C++2005的开发技术、DirectSound开发音频、DirectShow/VFW开发视频、MMX/SSE进行多媒体汇编编程、DM642 DSP进行音视频算法优化和主流视频算法MPEG-4/H.264的编码原理及工程实践。本书系统地...
主要内容包括软件Visual C++2005的开发技术、DirectSound开发音频、DirectShow/VFW开发视频、MMX/SSE进行多媒体汇编编程、DM642 DSP进行音视频算法优化和主流视频算法MPEG-4/H.264的编码原理及工程实践。本书系统地...
主要内容包括软件Visual C++2005的开发技术、DirectSound开发音频、DirectShow/VFW开发视频、MMX/SSE进行多媒体汇编编程、DM642 DSP进行音视频算法优化和主流视频算法MPEG-4/H.264的编码原理及工程实践。本书系统地...
关于:这是一个使用DirectX11和Direct2D来创建2D / 3D游戏引擎的游戏引擎,它将用作学习工具,使我能够扩展自己从大学获得的知识并在毕业后的自己的时间里学习。它将使用一个存档的非固定存储库(DirectX11Engine-旧...
主要内容包括软件Visual C++2005的开发技术、DirectSound开发音频、DirectShow/VFW开发视频、MMX/SSE进行多媒体汇编编程、DM642 DSP进行音视频算法优化和主流视频算法MPEG-4/H.264的编码原理及工程实践。本书系统地...
使用DirectX 向导初始化 Direct3D 使用物理建模框架初始化 Direct3D 小结(删除) 第三节:3D 编程和物理学的数学工具(删除) 三角几何(删除) 2D坐标系(删除) 3D和4D坐标系(删除) 物理单位...
Visual C++ 6 .0 多媒体(高清文字版) 开发指南 李博轩 编著 清华大学出版社 目 录 第1章 Visual C++ 6 .0简介....................... 1 1 .1 Visual C++ 6 .0 概述....................... 1 1 .2 Visual C++ 6 ...
程序的创建将不使用方便的MFC(Microsoft Foundation Class Library,微软的C++基础类库)向导,而是使用最原始的Win32 应用程序开发环境。熟悉VC++的读者可能会问,为什么舍先进的MFC工具不用,而去使用最原始的...
主要内容包括软件Visual C++2005的开发技术、DirectSound开发音频、DirectShow/VFW开发视频、MMX/SSE进行多媒体汇编编程、DM642 DSP进行音视频算法优化和主流视频算法MPEG-4/H.264的编码原理及工程实践。本书系统地...