DirectX11入门教程——第二篇:DirectX11的基础知识

本系列系作者原创,可随便转发但一定要注明出处

刚才明明说尽量不跳章的,为啥一进来就变成第二章,这里首先用几句话说明一下原因:因为第一章我想留给更基础更概念的GPU发展史和管线描述。在此对不起大家了。不过我保证这个系列初步成型后绝对不跳章

2010年5月微软发布了DirectX11这个DirectX SDK系列家族的最新成员,伴随着SDK的升级,DirectX11带给我的是功能的扩展,性能的改善,GPU存储空间的完全虚拟化等一系列好处!下面简要说明一下DirectX11相对于系列前辈的主要新特征:

关于Direct3D10特性的继承(针对有经验的读者)

由于Direct3D11是在对Direct3D10进行扩展设计的原则下产生的。其改动有:设备丢失处理废弃,CAPS Bit废弃,

固定流水线终于被废弃,但Geometry Shader得到了保留。

Computer Shader

相对于CPU作为操作系统、一般应用程序的通用架构来说,GPU一直作为图形,图形处理的专用架构来使用。由于Computer Shader的出现,GPU终于可以做为专也图形处理以外的数据并行处理等通用架构来使用了!

这里要做一点说明的是:Computer Shader是通过Direct3D设备被其他图形处理系的Shader和资源共享的!不能直接与其他Shader进行连接!

Tessellation

一句话就是:将精度比较低的Primitive进行分割,以获得更高精度的Primitive的功能,该功能为一个阶段3个单元

其中Hull和Domain是可编程的,Tessellator是固定管线,具体为啥要这么设计后面高级部分会进行详细说明

MultiThread Rendering

由于Direct3D11强化了多线程处理,以前的ID3D9Device、ID3D10Device在Direct3D11中被一分为二,即:

ID3D11Device和ID3D11DeviceContext。ID3D11DeviceContext被分类为ImmediateContext和DeferredContext。其中ImmediateContext为Device直接渲染的DeviceContext所以只能有一个,单线程渲染的情况下也只需要创建一个ImmediateContext即可。相对的DeferredContext可以有多个他们被主线程以外的工作线程使用。

动态 Shader Link

对于一般的的渲染过程,对于不同Material需要切换不同的Shader进行渲染。因此渲染的对象不同可能需要使用的Shader也不同。在解决这个问题上一般有两个方案:1 创建一个具有所有功能的万能Shader。只制作所需的不同原子功能的Shader组件,以后对他们进行组合就行了。第一种方案无疑是以牺牲性能为前提的。第二种方案由于组合Shader的增加,引擎需要管理数量爆炸的Shader组合。动态 Shader Link的引入无疑解决了第二种方案产生的棘手问题。

Feature Level的支持

Direct3D10的时代,使用Direct3D10的应用程序的运行必须得到硬件的支持,在Direct3D11中由于引入了6个阶段的FeatureLevel,对于Direct3D9/10/11的硬件设备 根据对应的FeatureLevel都能运行使用Direct3D11特性的应用程序。因此有人说使用了Direct3D11特性的程序只能在Direct3D11设备上运行完全是谬论!

Resource

Direct3D11定义了读取专用/写入专用,结构体Buffer等各种新类型的Resource。这里就不做更多复数了。更让人激动的是Direct3D11终于支持了大于4G的Resource,这虽然让人激动,但还是需要注意:Resource Index仍然是32位。这一点可能稍微让人有点不爽!

Shader Mode 5.0

Direct3D11中SM终于升级到5.0了,大家鼓掌!!!与Direct3D10一样采用了 Unified-Shader的架构,即:包括Computer Shader在内所有Shader都是用同样的HLSL通用语法。关于HLSL我在想是另外放在Shader专题里呢还是混在这个入门教程里讲。这个希望大家能给点意见。

WARP(Windows Advanced Rasterizer)

手有点累了,这个内容也有点烦了,随让我是个没长性的人呢?暂时写到这里,本章未完待续。







你可能感兴趣的:(DirectX11入门讲座)