热门标签 | 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的重要特性。



推荐阅读
  • 拥抱Android Design Support Library新变化(导航视图、悬浮ActionBar)
    转载请注明明桑AndroidAndroid5.0Loollipop作为Android最重要的版本之一,为我们带来了全新的界面风格和设计语言。看起来很受欢迎࿰ ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • Html5-Canvas实现简易的抽奖转盘效果
    本文介绍了如何使用Html5和Canvas标签来实现简易的抽奖转盘效果,同时使用了jQueryRotate.js旋转插件。文章中给出了主要的html和css代码,并展示了实现的基本效果。 ... [详细]
  • 海马s5近光灯能否直接更换为H7?
    本文主要介绍了海马s5车型的近光灯是否可以直接更换为H7灯泡,并提供了完整的教程下载地址。此外,还详细讲解了DSP功能函数中的数据拷贝、数据填充和浮点数转换为定点数的相关内容。 ... [详细]
  • 本文介绍了绕过WAF的XSS检测机制的方法,包括确定payload结构、测试和混淆。同时提出了一种构建XSS payload的方法,该payload与安全机制使用的正则表达式不匹配。通过清理用户输入、转义输出、使用文档对象模型(DOM)接收器和源、实施适当的跨域资源共享(CORS)策略和其他安全策略,可以有效阻止XSS漏洞。但是,WAF或自定义过滤器仍然被广泛使用来增加安全性。本文的方法可以绕过这种安全机制,构建与正则表达式不匹配的XSS payload。 ... [详细]
  • 如何提高PHP编程技能及推荐高级教程
    本文介绍了如何提高PHP编程技能的方法,推荐了一些高级教程。学习任何一种编程语言都需要长期的坚持和不懈的努力,本文提醒读者要有足够的耐心和时间投入。通过实践操作学习,可以更好地理解和掌握PHP语言的特异性,特别是单引号和双引号的用法。同时,本文也指出了只走马观花看整体而不深入学习的学习方式无法真正掌握这门语言,建议读者要从整体来考虑局部,培养大局观。最后,本文提醒读者完成一个像模像样的网站需要付出更多的努力和实践。 ... [详细]
  • 纠正网上的错误:自定义一个类叫java.lang.System/String的方法
    本文纠正了网上关于自定义一个类叫java.lang.System/String的错误答案,并详细解释了为什么这种方法是错误的。作者指出,虽然双亲委托机制确实可以阻止自定义的System类被加载,但通过自定义一个特殊的类加载器,可以绕过双亲委托机制,达到自定义System类的目的。作者呼吁读者对网上的内容持怀疑态度,并带着问题来阅读文章。 ... [详细]
  • 基于Socket的多个客户端之间的聊天功能实现方法
    本文介绍了基于Socket的多个客户端之间实现聊天功能的方法,包括服务器端的实现和客户端的实现。服务器端通过每个用户的输出流向特定用户发送消息,而客户端通过输入流接收消息。同时,还介绍了相关的实体类和Socket的基本概念。 ... [详细]
  • 合并列值-合并为一列问题需求:createtabletab(Aint,Bint,Cint)inserttabselect1,2,3unionallsel ... [详细]
  • ***byte(字节)根据长度转成kb(千字节)和mb(兆字节)**parambytes*return*publicstaticStringbytes2kb(longbytes){ ... [详细]
  • Android实战——jsoup实现网络爬虫,糗事百科项目的起步
    本文介绍了Android实战中使用jsoup实现网络爬虫的方法,以糗事百科项目为例。对于初学者来说,数据源的缺乏是做项目的最大烦恼之一。本文讲述了如何使用网络爬虫获取数据,并以糗事百科作为练手项目。同时,提到了使用jsoup需要结合前端基础知识,以及如果学过JS的话可以更轻松地使用该框架。 ... [详细]
  • 本文介绍了在Cpp中将字符串形式的数值转换为int或float等数值类型的方法,主要使用了strtol、strtod和strtoul函数。这些函数可以将以null结尾的字符串转换为long int、double或unsigned long类型的数值,且支持任意进制的字符串转换。相比之下,atoi函数只能转换十进制数值且没有错误返回。 ... [详细]
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社区 版权所有