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



推荐阅读
  • 本文介绍了如何在iOS平台上使用GLSL着色器将YV12格式的视频帧数据转换为RGB格式,并展示了转换后的图像效果。通过详细的技术实现步骤和代码示例,读者可以轻松掌握这一过程,适用于需要进行视频处理的应用开发。 ... [详细]
  • 兆芯X86 CPU架构的演进与现状(国产CPU系列)
    本文详细介绍了兆芯X86 CPU架构的发展历程,从公司成立背景到关键技术授权,再到具体芯片架构的演进,全面解析了兆芯在国产CPU领域的贡献与挑战。 ... [详细]
  • 2020年9月15日,Oracle正式发布了最新的JDK 15版本。本次更新带来了许多新特性,包括隐藏类、EdDSA签名算法、模式匹配、记录类、封闭类和文本块等。 ... [详细]
  • 在《Cocos2d-x学习笔记:基础概念解析与内存管理机制深入探讨》中,详细介绍了Cocos2d-x的基础概念,并深入分析了其内存管理机制。特别是针对Boost库引入的智能指针管理方法进行了详细的讲解,例如在处理鱼的运动过程中,可以通过编写自定义函数来动态计算角度变化,利用CallFunc回调机制实现高效的游戏逻辑控制。此外,文章还探讨了如何通过智能指针优化资源管理和避免内存泄漏,为开发者提供了实用的编程技巧和最佳实践。 ... [详细]
  • 本文介绍了如何在 Spring Boot 项目中使用 spring-boot-starter-quartz 组件实现定时任务,并将 cron 表达式存储在数据库中,以便动态调整任务执行频率。 ... [详细]
  • 自然语言处理(NLP)——LDA模型:对电商购物评论进行情感分析
    目录一、2020数学建模美赛C题简介需求评价内容提供数据二、解题思路三、LDA简介四、代码实现1.数据预处理1.1剔除无用信息1.1.1剔除掉不需要的列1.1.2找出无效评论并剔除 ... [详细]
  • Leetcode学习成长记:天池leetcode基础训练营Task01数组
    前言这是本人第一次参加由Datawhale举办的组队学习活动,这个活动每月一次,之前也一直关注,但未亲身参与过,这次看到活动 ... [详细]
  • Spring Data JdbcTemplate 入门指南
    本文将介绍如何使用 Spring JdbcTemplate 进行数据库操作,包括查询和插入数据。我们将通过一个学生表的示例来演示具体步骤。 ... [详细]
  • 为什么多数程序员难以成为架构师?
    探讨80%的程序员为何难以晋升为架构师,涉及技术深度、经验积累和综合能力等方面。本文将详细解析Tomcat的配置和服务组件,帮助读者理解其内部机制。 ... [详细]
  • 在CentOS 7环境中安装配置Redis及使用Redis Desktop Manager连接时的注意事项与技巧
    在 CentOS 7 环境中安装和配置 Redis 时,需要注意一些关键步骤和最佳实践。本文详细介绍了从安装 Redis 到配置其基本参数的全过程,并提供了使用 Redis Desktop Manager 连接 Redis 服务器的技巧和注意事项。此外,还探讨了如何优化性能和确保数据安全,帮助用户在生产环境中高效地管理和使用 Redis。 ... [详细]
  • 在本地环境中部署了两个不同版本的 Flink 集群,分别为 1.9.1 和 1.9.2。近期在尝试启动 1.9.1 版本的 Flink 任务时,遇到了 TaskExecutor 启动失败的问题。尽管 TaskManager 日志显示正常,但任务仍无法成功启动。经过详细分析,发现该问题是由 Kafka 版本不兼容引起的。通过调整 Kafka 客户端配置并升级相关依赖,最终成功解决了这一故障。 ... [详细]
  • 在探讨 MySQL 正则表达式 REGEXP 的功能与应用之前,我们先通过一个小实验来对比 REGEXP 和 LIKE 的性能。通过具体的代码示例,我们将评估这两种查询方式的效率,以确定 REGEXP 是否值得深入研究。实验结果将为后续的详细解析提供基础。 ... [详细]
  • 尽管我们尽最大努力,任何软件开发过程中都难免会出现缺陷。为了更有效地提升对支持部门的协助与支撑,本文探讨了多种策略和最佳实践,旨在通过改进沟通、增强培训和支持流程来减少这些缺陷的影响,并提高整体服务质量和客户满意度。 ... [详细]
  • 深入解析 Golang 中 Context 的功能与应用
    本文详细探讨了 Golang 中 Context 的核心功能及其应用场景,通过深入解析其工作机制,帮助读者更好地理解和运用这一重要特性,对于提升代码质量和项目开发效率具有重要的参考价值。 ... [详细]
  • Netty框架中运用Protobuf实现高效通信协议
    在Netty框架中,通过引入Protobuf来实现高效的通信协议。为了使用Protobuf,需要先准备好环境,包括下载并安装Protobuf的代码生成器`protoc`以及相应的源码包。具体资源可从官方下载页面获取,确保版本兼容性以充分发挥其性能优势。此外,配置好开发环境后,可以通过定义`.proto`文件来自动生成Java类,从而简化数据序列化和反序列化的操作,提高通信效率。 ... [详细]
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社区 版权所有