关于D3D11,你必须了解的几件事情(一)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

关于D3D11,你必须了解的⼏件事情(⼀)
仅以此⽂献给那些⾃以为了解D3D11的专家
D3D11正式发布已经有两年多了。

在这短短的时间⾥,各GPU⼚商都相继推出了⽀持D3D11的显卡,许多游戏引擎也迅速推出了对D3D11的⽀持。

但在国内,D3D11的接受度⼏乎为零。

国内很多“⼤”游戏公司的“技术⼈员”对于D3D11完全出于⼀知半解的状态,却⼜在不懂装懂地指⼿画脚。

关于D3D11,有些事情你确实必须了解。

Feature Level
从KlayGE 3.11.0发布以来,⼏乎每个⽉都会听见有⼈问我,“为什么要去掉D3D9和D3D10插件,仅保留D3D11和OpenGL?”。

(最近这个频率显著提⾼,基本到了每周1-2次的程度)。

在他们的观点⾥,D3D11就得在D3D11的硬件上跑,⽽现在D3D11硬件尚未普及,这么做会影响到 KlayGE在D3D10硬件上的运⾏。

我对这类问题的回答⼀般是⾮常冰冷的“为什么不了解D3D11就枉加评论”。

D3D11的⼀个最基本知识就是feature level。

其实这不是新发明,在D3D 10.1的时候就提出来了,只是因为D3D 10.1的使⽤量实在太⼩,直接被忽略了。

feature level对D3D11的功能进⾏了划分,不同功能所需要的最低硬件要求是不同的。

feature level的存在使得D3D11 runtime可以在D3D10甚⾄D3D9的硬件上执⾏。

下⾯我们从低到⾼看⼀些各个feature level所能做的事情。

Feature level典型显卡能⼒
D3D_FEATURE_9_1Intel G965,NV
GeforceFX 5200,ATI
Radeon 9600
D3D9硬件:必须⽀持SM2,2k⼤⼩的纹理,3D纹理,query,BC1-3
D3D_FEATURE_9_2NV GeforceFX
5600,ATI Radeon
9500
D3D9硬件:必须⽀持SM2,occlusion query,浮点纹理,所有9_1的功能
D3D_FEATURE_9_3NV GeforceFX 6600, ATI
Radeon X1300
D3D9硬件:必须⽀持SM2b,instancing,4k⼤⼩的纹理,MRT,浮点纹理混合,所有
9_2的功能
D3D_FEATURE_10_0NV Geforce 8800/GTX
280
D3D10 硬件:必须⽀持SM4,geometry shader,stream output,alpha to
coverage,MSAA纹理,双⾯stencil,texuture array,BC4/5,所有9_3的功能;可选⽀
持compute shader 4.0
D3D_FEATURE_10_1ATI Radeon HD
2/3/4,NV Geforce
GT220
D3D10.1硬件:必须⽀持SM4.1,cubemap array,扩展的MSAA,所有10_0的功能;
可选⽀持compute shader 4.1
D3D_FEATURE_11_0ATI Radeon HD 5/6,
NV Geforce GTX 4/5
D3D11硬件:必须⽀持SM5,tessellation,hull shader,domain shader,compute
shader 5,BC6H/BC7,所有10_1的功能
所以很明显,D3D11并不⼀定要D3D11的GPU。

在D3D10的GPU上,D3D11的功能相当于原有D3D10的,加上compute shader 4.0,以及可能有multi-threading。

性能取决于⼚商驱动,⽬前来说性能可以做到和D3D10完全⼀致。

在D3D9的GPU上的也可以类⽐出来。

唯⼀不同的是vertex texture fetch,即使level 9_3也只有instancing⽽没有VTF。

其实在SM3的GPU上,NV的6系列和7系列的VTF性能和⽀持的纹理格式特别差,使得VTF的实⽤性很有限。

ATI更是⼀直放弃了VTF,⾃⼰搞出来R2VB的⽅法,性能上远超VTF。

后期的驱动⾥,NV的SM3 GPU也都⽀持R2VB了,所以R2VB反⽽后来居上成为通⽤的功能。

除此之外,D3D11在早期硬件上执⾏,只会带来好处,没有损失。

有了feature level这个重要的能⼒,D3D10已经完全没有存在的必要。

所以,KlayGE、CE3、UE3这些渲染技术⼀流的游戏引擎全都不约⽽同地跳过或者删除了D3D10的⽀持,直奔D3D11。

顺便说说D3D9。

⽬前D3D9存在的唯⼀理由是⼴⼤的XP⽤户。

但实际上很多⼈都是有D3D10的GPU,⽽因为XP被限制在了D3D9上。

其实XP下的 OpenGL驱动也是与时俱进的,可以给XP带来原本属于D3D10/11的新GPU能⼒,⼜没有性能损失。

因此KlayGE坚决地去掉了
D3D9,让 OpenGL接⼿D3D9在XP上的任务。

Optional Features
当年D3D10在宣传的时候,有个好处就是没有caps。

在D3D9时代,caps⼏乎折磨了每⼀个程序员。

实现某个功能之前经常需要根据caps作判断,来选择不同的⽅法。

D3D10去掉了所有的caps,要求硬件都必须达到某个规范,解放了caps测试。

话虽如此,实际上D3D10还是留了⼀⼿。

ID3D10Device和ID3D11Device⾥⾯都有个叫作CheckFormatSupport的函数,可以检查某个格式是否⽀持,只是可选的范围⾮常窄罢了。

(理论上驱动还可以通过这种⽅式暴露出D3D1x本⾝不⽀持的古怪格式,就好象它们在D3D9 时代做的事情⼀样)
⽤过D3D10的⼈⼀般会发现,D3D10不⽀持ARGB这种D3D9上最常⽤的颜⾊格式,然后开始抓狂。

其实按照定义,那个格式在D3D11⾥⾯应该是这样的:对feature level 9_x和11_0是必须⽀持,对feature level 10_x是可选⽀持。

所以解决⽅法很简单,升级到D3D11就是了。

另外,feature level 11_0还必须⽀持R10G10B10_XR_BIAS_X2_A2_UNORM(我也不知道这个格式是做什么的),⽽feature level 10_x是可选⽀持,9_x是不⽀持。

在D3D11⾥,格式的⽀持情况⼀般取决于feature level,所以直接通过feature level检查就可以了,⼤可不必每个格式每次逐⼀检查。

除了CheckFormatSupport之外,D3D11还增加了 CheckFeatureSupport这个函数,⽤来检查multithread、double、atomic、compute shader 4.x是否⽀持。

所以说,caps不是完全消失,⽽是尽可能变少。

但保证剩下的都是有意义的,不能随便忽视。

本篇到此为⽌,下⼀篇会讲其他D3D11的重要特性。

相关文档
最新文档