热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

转载请注明出处为KlayGE游戏引擎,本文地址为http:www.klayge.org20110809%e5%85%b3%e4%ba%8ed3d11%ef%bc%8c

转载请注明出处为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_1Intel G965,NV GeforceFX 5200,ATI Radeon 9600D3D9硬件:必须支持SM2,2k大小的纹理,3D纹理,query,BC1-3
D3D_FEATURE_9_2NV GeforceFX 5600,ATI Radeon 9500D3D9硬件:必须支持SM2,occlusion query,浮点纹理,所有9_1的功能
D3D_FEATURE_9_3NV GeforceFX 6600, ATI Radeon X1300D3D9硬件:必须支持SM2b,instancing,4k大小的纹理,MRT,浮点纹理混合,所有9_2的功能
D3D_FEATURE_10_0NV Geforce 8800/GTX 280D3D10 硬件:必须支持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 GT220D3D10.1硬件:必须支持SM4.1,cubemap array,扩展的MSAA,所有10_0的功能;可选支持compute shader 4.1
D3D_FEATURE_11_0ATI Radeon HD 5/6, NV Geforce GTX 4/5D3D11硬件:必须支持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的重要特性。



推荐阅读
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 提升Python编程效率的十点建议
    本文介绍了提升Python编程效率的十点建议,包括不使用分号、选择合适的代码编辑器、遵循Python代码规范等。这些建议可以帮助开发者节省时间,提高编程效率。同时,还提供了相关参考链接供读者深入学习。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • 本文讨论了Kotlin中扩展函数的一些惯用用法以及其合理性。作者认为在某些情况下,定义扩展函数没有意义,但官方的编码约定支持这种方式。文章还介绍了在类之外定义扩展函数的具体用法,并讨论了避免使用扩展函数的边缘情况。作者提出了对于扩展函数的合理性的质疑,并给出了自己的反驳。最后,文章强调了在编写Kotlin代码时可以自由地使用扩展函数的重要性。 ... [详细]
  • SpringBoot整合SpringSecurity+JWT实现单点登录
    SpringBoot整合SpringSecurity+JWT实现单点登录,Go语言社区,Golang程序员人脉社 ... [详细]
  • 本文由编程笔记#小编为大家整理,主要介绍了logistic回归(线性和非线性)相关的知识,包括线性logistic回归的代码和数据集的分布情况。希望对你有一定的参考价值。 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
  • 海马s5近光灯能否直接更换为H7?
    本文主要介绍了海马s5车型的近光灯是否可以直接更换为H7灯泡,并提供了完整的教程下载地址。此外,还详细讲解了DSP功能函数中的数据拷贝、数据填充和浮点数转换为定点数的相关内容。 ... [详细]
  • IOS开发之短信发送与拨打电话的方法详解
    本文详细介绍了在IOS开发中实现短信发送和拨打电话的两种方式,一种是使用系统底层发送,虽然无法自定义短信内容和返回原应用,但是简单方便;另一种是使用第三方框架发送,需要导入MessageUI头文件,并遵守MFMessageComposeViewControllerDelegate协议,可以实现自定义短信内容和返回原应用的功能。 ... [详细]
  • Java和JavaScript是什么关系?java跟javaScript都是编程语言,只是java跟javaScript没有什么太大关系,一个是脚本语言(前端语言),一个是面向对象 ... [详细]
author-avatar
永远在等一个人--嘉儿
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有