zoukankan      html  css  js  c++  java
  • 关于D3D11,你必须了解的几件事情(一)

    转载请注明出处为KlayGE游戏引擎,本文地址为http://www.klayge.org/2011/08/09/%e5%85%b3%e4%ba%8ed3d11%ef%bc%8c%e4%bd%a0%e5%bf%85%e9%a1%bb%e4%ba%86%e8%a7%a3%e7%9a%84%e5%87%a0%e4%bb%b6%e4%ba%8b%e6%83%85%ef%bc%88%e4%b8%80%ef%bc%89/

    仅以此文献给那些自以为了解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_1 Intel G965,NV GeforceFX 5200,ATI Radeon 9600 D3D9硬件:必须支持SM2,2k大小的纹理,3D纹理,query,BC1-3
    D3D_FEATURE_9_2 NV GeforceFX 5600,ATI Radeon 9500 D3D9硬件:必须支持SM2,occlusion query,浮点纹理,所有9_1的功能
    D3D_FEATURE_9_3 NV GeforceFX 6600, ATI Radeon X1300 D3D9硬件:必须支持SM2b,instancing,4k大小的纹理,MRT,浮点纹理混合,所有9_2的功能
    D3D_FEATURE_10_0 NV 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_1 ATI Radeon HD 2/3/4,NV Geforce GT220 D3D10.1硬件:必须支持SM4.1,cubemap array,扩展的MSAA,所有10_0的功能;可选支持compute shader 4.1
    D3D_FEATURE_11_0 ATI 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的重要特性。

  • 相关阅读:
    Asp.net2.0 中自定义过滤器对Response内容进行处理 dodo
    自动化测试工具 dodo
    TestDriven.NET 2.0——单元测试的好助手(转) dodo
    JS弹出窗口的运用与技巧 dodo
    ElasticSearch 简介 规格严格
    修改PostgreSQL字段长度导致cached plan must not change result type错误 规格严格
    Linux系统更改时区(转) 规格严格
    mvn编译“Cannot find matching toolchain definitions for the following toolchain types“报错解决方法 规格严格
    ElasticSearch 集群 & 数据备份 & 优化 规格严格
    Elasticsearch黑鸟教程22:索引模板的详细介绍 规格严格
  • 原文地址:https://www.cnblogs.com/gongminmin/p/2132165.html
Copyright © 2011-2022 走看看