(注:【D3D11游戏编程】学习笔记系列由CSDN作者BonChoix所写,转载请注明出处:http://blog.csdn.net/BonChoix,谢谢~)
初次使用D3D11,先从它的初始化开始。不过在使用D3D之前,需要了解几个重要的概念:
1. 硬件能力:Hardware Capacity
熟悉D3D9的会很清楚,在初始化d3d9的一开始需要做的就是检测硬件的能力,以了解该用户机器支持哪些d3d特性,哪些不支持,以在运行期合理的调用API。除非使用d3d自带的“软件渲染引擎”,否则试图使用硬件不支持的特性是会出错的。但是在d3d11中,检测硬件能力这一步不再有必要。这对程序员来说省了一点功夫,但是额外的要求是,该硬件必须支持d3d11的全部特性!因此实际上,d3d11应用程序对硬件的要求更苛刻了。
2. 数据格式
D3D应用程序中,无论是纹理图片,还是创建的缓冲区,都有着特定的数据格式。D3D11支持有限的数据格式,以枚举变量形式存在,如下几种:
DXGI_FORMAT_R32G32B32_FLOAT: 3个32位单精度符点数组成,比如用于代表三维空间坐标,以及24位颜色;
DXGI_FORMAT_R16G16B16A16_UNORM: 4个16位数组成,每个成员位于[0,1.0f]之间,UNORM意指:unsigned normalized,即无符号,且归一化的;
DXGI_FORMAT_R32G32_UINT:2个32位数组成,每个成员为无符号整型(unsigned int);
DXGI_FORMAT_R8G8B8A8_UNORM:4个8位数组成,每个成员为[0,1.f]之间;
DXGI_FORMAT_R8G8B8A8_SNORM:4个8位数组成,每个成员为[-1.0f, 1.0f]之间,SNORM意指:signed normalized;
DXGI_FORMAT_R8G8B8A8_SINT:4个8位数组成,每个成员为有符号整型;
此外还有很多其他类型的数据格式,熟悉各部分的意义后对任何类型可以很快从名字中得知其意思,也很容易写出指定意义的数据格式对应的枚举变量。数据格式在程序中使用相当频繁,因此很有必要提前熟悉该枚举类型变量的特点。
3. DXGI
DXGI,即DirectX Graphics Infrastructure,是从d3d10开始出现的,封装了一些d3d底层、基础的机制,包括数据格式定义、交换链(SwapChain),枚举设备类型及检测设备信息等。由于这些机制适合于任何一代的D3D接口,而跟特定的d3d特性无关,更新远不及其他d3d特性频繁,因此微软把这些从direct3d中单独分离了出来。这部分对应的枚举变量及函数等都以DXGI开头。
4. 交换链:SwapChain
交换链不是d3d11特有的性质,而是任何2D、3D计算机动画最基本的机制之一。为了实现平滑的动画,至少需要两个缓冲区,一个前缓冲区用于显示,一个后缓冲区用于下一帧的绘制,每次绘制完一帧后通过交换前、后缓冲区对应的指针来显示新一帧,并在之前的前缓冲区(当前的后缓冲区)上开始继续绘制下一帧。交换链可以有3个或者更多缓冲欧,但绝大多数情况下,2个已经足够了。在d3d11中交换链对应的接口为IDXGISwapChain。
5. 深度/模板缓冲区:Depth/Stencil Buffer
深度缓冲区是与交换链缓冲区大小完全一样的一块显存区域,即每个像素在深度缓冲区中对应相应的位置。在渲染管线的最终的混合阶段(Output Merger Stage),每个片段(Fragment)都有一个深度值z,与深度缓冲区对应位置上的深度相比较,如果该片段z更小,则绘制该片段,并覆盖当前的尝试值,否则抛弃该片段。该缓冲区主要用于实现投影在屏幕上同一位置、远近不同的物体之间相同的遮挡效果。此外,灵活配置尝试缓冲区,可以实现很多种高级特效。
模板缓冲区与深度缓冲区共享同一块区域,每个深度值处对应一个模板值,模板值主要用于实现一些高级的特效,比如平面反射、阴影等。利用深度、模板缓冲区的不同的configuration实现各种特效在后面会有详细介绍的。
6. 视图(View)
视图是D3D11中的最重要的概念之一。以纹理为例,一个纹理可以被绑定到3D渲染管线的不同阶段以实现不同的用途。比如常见的纹理图片(d3d11中叫Shader Resource),另一方面也可用于渲染对象(Render Target)&