乘风破浪,遇见最美Windows 11之现代Windows桌面应用开发 - Metal、Vulkan、Direct3D 12三大图形引擎架构演进
低级别的图形API和驱动开销
https://www.profesionalreview.com/2019/04/16/directx-12-vs-vulkan/
API是 "应用编程接口 "的意思,是一组开发人员可以使用的子程序,其中还包括促进软件开发的通信协议和实用程序。几乎所有的东西都可以找到他们,而且每个服务提供商都有这种类型的帮助,以一种简单和方便的方式实施他们的系统,这很常见。
低级别的API能更好地利用GPU资源,释放CPU的开销,但它们也能更好地利用当今的多核处理器。
DirectX 12和Vulkan 1.1都是API,旨在开发需要现代图形引擎协助的游戏和应用程序。它们也是最重要的图形芯片组设计者的驱动程序所支持的API,因此是一种快速和廉价的方式来访问其功能,而不需要在很低的水平上了解其设计。
像这样的低级API,允许用非常轻的解释层与硬件一起工作,这使开发者能够更好地利用硬件,在性能和效率方面取得更好的效果,同时也减轻了其他子系统的额外负担。在个人电脑或移动电话的世界里,这意味着对系统的通用CPU的依赖性降低。
我们今天要谈的两个API可以被认为是低级别的API,这两个发展都使我们对系统的CPU的依赖性越来越小,同时取得了更好的性能结果和对更高级图形功能的访问。它们都是活的API,每年都在接受更新,以保持它们与公众和开发者的期望一致。
低级别的API对另一个被称为 "驱动开销 "的计算概念有直接影响,简而言之,就是我们在计算机上运行某些类型的操作所需要的次级资源。就图形而言,这指的是图形卡完成其工作所需的额外资源,在这种情况下,它主要是中央CPU的处理时间。我们将在这里描述的低级别的API减少了这种依赖性,事实上,这种依赖性趋于0。
什么是Metal
https://developer.apple.com/cn/metal/
提升运行速度,远不止图形而已
渲染高级3D图形,并使用图形处理器进行数据并行计算。
Metal提供了针对平台优化的低开销API,让您可以利用丰富的着色语言,以及图形与计算程序之间更加紧密的集成,开发最新的3D专业app和令人惊叹的游戏。为了帮助您管理更加复杂的着色器代码并同时完成更多工作,Metal新增了一套出色的高级GPU调试工具,助您充分发挥图形代码的潜力。
Metal是由苹果公司所开发的一个应用程序接口(API),兼顾图形与计算功能,面向底层、低开销的硬件加速。其类似于将OpenGL与OpenCL的功能集成到了同一个API上,最初支持它的系统是iOS8。Metal使得iOS可以实现其他平台的类似功能,例如Khronos Group的跨平台Vulkan与Microsoft Windows上的Direct 3D 12。
Metal也通过引入计算着色器来进一步提高GPGPU编程的能力。
Metal使用一种基于C++ 11的新着色语言,其实现借助了Clang和LLVM。
历史
2014年6月2日,Metal开始支持iOS设备(仅支持AppleA7或更新款处理器的iPhone、iPad);2015年6月8日,Metal开始支持运行OS X El Capitan的Mac设备(仅2012年中或更新款机种)。
2017年6月5日,Apple于WWDC宣布了Metal的第二个版本,支持macOS High Sierra、iOS 11和tvOS 11。Metal 2不是Metal的独立API,并且由需要的硬件支持。Metal 2在Xcode中实现了更高效的分析和调试,加速了机器学习、降低了CPU工作负载、支持macOS上的虚拟现实以及Apple A11处理器的特性。
2019年6月3日,Metal API更新到第三个版本,支持macOS Catalina、iOS 13和iPadOS 13。
2020年的苹果全球开发者大会(WWDC)上,苹果宣布将Mac迁移到Apple Silicon。使用Apple Silicon的Mac将使用Apple GPU,支持之前在macOS和iOS上实现的特色功能,并将能够利用为Apple GPU架构所定制的基于图块的延迟渲染(TBDR)功能
概述
图形处理器(GPU)被设计用来快速渲染图形和执行数据并行计算。当你需要与设备上可用的GPU直接通信时,请使用Metal框架。渲染复杂场景或进行高级科学计算的应用程序可以利用这种力量来实现最大的性能。这类应用包括
- 渲染复杂3D环境的游戏
- 视频处理应用程序,如Final Cut Pro
- 数据处理应用程序,如那些用于执行科学研究的应用程序
Metal与其他补充其能力的框架携手合作。使用MetalKit来简化让你的金属内容出现在屏幕上的任务。使用Metal Performance Shaders来实现自定义的渲染功能,或利用现有的大型函数库。
许多高水平的苹果框架都建立在Metal之上,以利用其性能优势,包括Core Image、SpriteKit和SceneKit。使用这些高级框架之一可以使你免受GPU编程细节的影响,但编写自定义Metal代码可以使你获得最高水平的性能。
新功能
- 增强的图形与计算集成
为了更好地运用最新的GPU渲染技术,您现在可以直接从图形着色器调用动态库、使用函数指针,以及利用光线追踪API。
- 函数拼接
在运行时高效地将预编译的函数组合成更复杂的函数。这样一来,着色器创作工具就能预编译各个着色器节点,同时在创作着色器时保持灵活性。
- 全新的光线追踪功能
光线追踪API现在支持运动模糊、用户实例ID和数字限制的扩展,可帮助您使用专业渲染生成极其复杂的场景。
- GPU加速机器学习训练
MPSGraph使用GPU上的基于Metal缓冲区的机器学习基元,添加了新的操作和优化,以便您在Mac上以更高的峰值性能加速机器学习模型训练。
- 适用于TensorFlow的Metal插件
Metal为TensorFlow增加了PluggableDevice接口支持,让您可以利用macOSMonterey的出众性能着手训练模型。
- GPU性能状态调试器
在所有Apple平台上优化您的图形代码,有效提高处理能力和性能表现。
- Metal调试器时间线视图
为帮助开发者通过最新的渲染技术实现峰值性能,Metal调试器现提供性能计数器和瓶颈分析工具,同时在GPU事件时间线上为Metal命令、资源和缓冲区提供了一个统一的视图。
- 选择性的着色器调试程序
为了显著缩短调试超大规模GPU着色器代码所需的时间,Xcode13现提供用于在整个GPU着色器代码中定位和调试特定函数的选项。
- GPU内存错误检测器
Xcode13可以在复杂的GPU着色器代码中自动找到难以发现的错误,例如缓冲区溢出。
- 纹理转换工具
为了简化为Apple平台优化游戏纹理素材资源的过程,新的纹理转换工具支持高端游戏所使用的最新现代纹理格式。对于使用Windows构建环境的游戏开发者,适用于Windows的Metal工具包中同样提供纹理转换工具。
什么是Vulkan
https://www.vulkan.org
https://en.wikipedia.org/wiki/Vulkan
Vulkan是一个低开销、跨平台的API,是3D图形和计算的开放标准。Vulkan的目标是高性能实时3D图形应用,如视频游戏和互动媒体。与旧的OpenGL和Direct3D 11 API相比,Vulkan旨在提供更高的性能和更平衡的CPU和GPU使用。它为应用程序提供了一个相当低级别的API和并行任务,与Metal和Direct3D 12相当。除了较低的CPU使用率外,Vulkan还被设计为允许开发者在多个CPU核心之间更好地分配工作。
Vulkan是由非营利组织Khronos Group在2015年GDC上首次宣布的。Vulkan API最初被Khronos称为 "下一代OpenGL计划",或 "OpenGL next",但在Vulkan宣布后,这些名称被停止使用了。
Vulkan源于并建立在AMD的Mantle API的基础上,该API是由AMD捐赠给Khronos的,目的是给Khronos一个基础,在此基础上开始开发一个低级别的API,他们可以对整个行业进行标准化。
Vulkan并不向后兼容OpenGL。
OpenGL和Vulkan都是渲染API。在这两种情况下,GPU执行着色器,而CPU执行其他一切。
2022年1月25日,Khronos通过发布Vulkan 1.3、公共路线图和配置文件加强了Vulkan的生态系统
https://www.khronos.org/news/press/vulkan-reduces-fragmentation-and-provides-roadmap-visibility-for-developers
Vulkan 1.3规定将广泛支持的功能纳入核心标准;Vulkan路线图提供了Vulkan对关键市场的未来要求的可见性;配置文件简化了便携式应用程序的开发和部署。
美国俄勒冈州比弗顿--2022年1月25日--今天,由创建先进互操作性标准的行业领先公司组成的开放联盟Khronos?集团宣布了跨平台3D图形API Vulkan及其生态系统的最新更新。
- Vulkan? 1.3规范于今天发布,纳入并强制规定了经过验证的、开发者要求的扩展,使该功能在所有支持的平台上一致可用。
- Vulkan工作组正在制定一个公共路线图,为何时何地支持更高级的Vulkan功能提供指导。针对中高端硬件的Vulkan路线图2022里程碑定义了Vulkan 1.3之外的功能,这些功能将在今年开始提供。
- 在2022年2月的Vulkan 1.3 SDK中,将引入Vulkan配置文件和工具,以精确指定、管理和使用API能力集。配置文件将用于沟通路线图、市场、平台以及硬件和软件开发人员的功能要求。
Vulkan 1.3和Vulkan路线图
Vulkan 1.3将开发者社区要求的一些精心挑选的扩展功能纳入了新的核心规范版本。其中包括动态渲染、额外的动态状态[1][2]、改进的同步API,以及一系列其他功能(详见Vulkan 1.3和路线图博文)。至关重要的是,与之前的版本不同,Vulkan 1.3中增加的功能都是可选的,这确保了它们在这个新API版本的所有实现中的一致性。
与以前的规范版本一样,Vulkan 1.3被设计为在OpenGL? ES 3.1级硬件上加速,使核心API能够得到广泛的设备和市场支持。许多Vulkan设备通过个别硬件供应商可能选择支持或不支持的可选扩展,支持超出核心规范的功能。Vulkan路线图旨在整合对选定扩展的支持,以便在关键市场提供一个共同的功能基线。
今天宣布的Vulkan路线图2022是Vulkan路线图中第一个确定的里程碑。所有积极开发智能手机、平板电脑、笔记本电脑、控制台和桌面平台的中高端设备的Vulkan工作组硬件供应商都承诺支持这一里程碑,从2022年的几个出货产品开始。该里程碑要求支持Vulkan 1.3以及工作组认为对目标市场至关重要的一些扩展,包括描述符索引、片段着色器存储和原子学、片段着色器中的子组支持、独立混合、采样着色、各向异性过滤、YCbCr采样和缓冲资源的标量块布局。路线图2022还提高了许多硬件限制的最小值,包括最大图像和图像阵列尺寸、最大子组大小,以及每个着色器阶段可以访问多少资源的各种限制。更多细节见Vulkan 1.3和路线图博文。
Vulkan配置文件
新的Vulkan配置文件机制能够精确地规范和管理成套的API能力。每个配置文件都指定了Vulkan的核心版本和一组所需的扩展,以及支持的限制、功能和格式。配置文件提供了一种在Vulkan生态系统的参与者之间精确沟通功能要求和设备能力的方法,以简化便携式应用程序的开发和部署。
谷歌已经开发并发布了安卓基线2021配置文件,以宣传安卓生态系统中绝大多数活跃设备所支持的超出Vulkan 1.0的功能集,包括那些不受支持和不定期接受驱动更新的设备。
Vulkan路线图2022简介将对Vulkan路线图的第一个里程碑进行编码,目前记录在Vulkan 1.3规范中,将于2月中旬与Vulkan SDK一起发布。
Khronos工具将使开发者能够生成他们自己的特定应用功能配置文件,轻松确定设备是否支持特定的配置文件,并在应用启动时启用配置文件中的功能/扩展。该工具的测试版将于2月中旬作为Vulkan 1.3 SDK的一部分发布,并将包括用于配置文件定义的机器可读文件格式、定义迄今为止发布的配置文件的文件、仅头文件库,以及通过新的VK_KHRONOS_LAYER_profiles层进行的配置文件模拟支持。
Vulkan的演变
"在Vulkan进化的新阶段,Vulkan工作组正在采取重大措施,以减少整个生态系统的碎片化,并提高Vulkan作为可靠的跨平台GPU API对行业的价值。我们继续将新的硬件功能作为扩展,同时用新的核心版本改进Vulkan API,使其可用于各种设备。Vulkan工作组主席、Arm公司杰出工程师Tom Olson说:"现在有了Vulkan路线图,我们承诺加强透明度和沟通,以便就最能服务于Vulkan关键市场的基准功能配置文件达成行业共识。
Vulkan工作组欢迎在GitHub上对Vulkan 1.3和提供路线图信息的新方法进行反馈。我们邀请开发者注册参加2022年2月1日的免费Vulkanised网络研讨会,该研讨会将提供关于今天公告的更多细节,并欢迎加入Vulkan 1.3 Discord频道。
行业支持
"AMD很高兴地宣布,我们希望在所有AMD Radeon? RX Vega系列和AMD RDNA?架构支持的显卡上支持Vulkan 1.3和Vulkan路线图2022配置文件。AMD Radeon软件测试版驱动程序今天可供开发人员使用,预计最终驱动程序将在未来几个月内支持。AMD软件开发高级副总裁Andrej Zdravkovic表示:"Vulkan工作组主动将各设备的硬件功能标准化,这是为关键市场的开发者提供一致支持的重要一步,我们相信这将最终转化为更好的开发者和终端用户体验。
"Vulkan 1.3规范的发布是一个重要的里程碑。Khronos标准的最新迭代带来了改善开发者体验的增强功能,包括引入Vulkan配置文件,使开发者更简单地了解平台能力和针对更广泛的设备。Arm致力于为开发者提供工具和技术,以实现下一代引人注目的设备体验,并将在我们的Mali GPU上支持Vulkan 1.3和Roadmap 2022配置文件,"Arm客户业务线生态系统和工程高级总监Geraint North说。
"Vulkan 1.3和Roadmap 2022里程碑为开发者带来了许多受欢迎的生活质量改进,比如动态渲染,它消除了对渲染通道和帧缓冲器对象的需求,为渲染提供了更精简的方法。我们期待着在Stadia上提供这些改进,"谷歌Stadia高级技术解决方案工程师Hai Nguyen说。
"Holochip为美国军方开发了光场和AR飞行训练和模拟技术,并正在将新的显示功能纳入现有的NAVAIR训练环境中。Vulkan 1.3规格将使下一代显示设备得到广泛采用。Vulkan 1.3规格为军事模拟环境从商业渲染市场的技术进步中获益铺平了道路。Holochip公司首席执行官Robert Batchko说:"这些进步将使训练更加有效,节约成本,并提高作战人员安全降低风险的能力。
"Vulkan能够支持具有巨大差异的外形尺寸和功率封套的硬件平台,这意味着它是我们高度可扩展的GPU的关键API,这些GPU被用于可穿戴设备、移动、汽车和数据中心及桌面。Vulkan 1.3对不同配置文件的标准化大大增强了该API对如此多样的设备和用例的适用性。Imagination Technologies软件产品管理总监Ploutarchos Galatsopoulos表示:"Vulkan 1.3是GPU行业领导者的工作,他们共同致力于实现GPU的未来,我们很高兴能成为其中的一员。
"LunarG对新的Vulkan Profiles解决方案感到兴奋。利用这个框架,开发者可以创建可移植的应用程序,这些应用程序将在保证具有必要支持功能的大型硬件集上运行。LunarG公司首席执行官兼工程总监Karen Ghavam、高级工程师Christophe Riccio表示:"与Vulkan SDK一起交付的Vulkan Profiles API库和Vulkan Profiles Layer将使开发者能够定义、使用和开发Vulkan配置文件。
"作为Vulkan的长期支持者,英伟达正在立即提供全功能的Vulkan 1.3驱动程序,支持Windows 10和11以及Linux(包括Ubuntu、Kylin和RHEL等流行发行版)上的路线图2022里程碑。英伟达软件工程高级副总裁Dwight Diercks表示:"英伟达还为我们的Jetson嵌入式计算平台准备了符合要求的Vulkan 1.3驱动程序。"我们的Nsight Graphics和Nsight Systems工具已经更新,以支持Vulkan 1.3,为开发者提供了一个强大的环境,并为其提供了深度支持,以构建和优化Vulkan游戏和应用"。
关于Vulkan
Vulkan是一个开放的、免版税的API,用于高效、跨平台地访问现代GPU,在领先的引擎、尖端游戏和高要求的应用中得到了广泛的应用。从Windows和Linux PC、游戏机和云端到手机和嵌入式平台,各种设备都支持Vulkan。
关于Khronos
Khronos集团是一个开放的、非营利的、由180多家行业领先的公司组成的联盟,为3D图形、增强和虚拟现实、并行编程、视觉加速和机器学习创造先进的、免版税的互操作性标准。Khronos的活动包括3D Commerce?、ANARI?、glTF?、NNEF?、OpenCL?、OpenGL?、OpenGL? ES、OpenVG?、OpenVX?、OpenXR?、SPIR-V?、SYCL?、Vulkan?和WebGL?。Khronos成员推动了Khronos规范的发展和演变,并能够通过尽早获得规范草案和一致性测试来加快尖端平台和应用的交付。
什么是DirectX
https://zh.wikipedia.org/zh-cn/DirectX
DirectX(Direct eXtension,缩写:DX)是由微软公司创建的一系列专为多媒体以及游戏开发的应用程序接口。旗下包含Direct3D、Direct2D、DirectCompute等等多个不同用途的子部分,因为这一系列API皆以Direct字样开头,所以DirectX(只要把X字母替换为任何一个特定API的名字)就成为这一巨大的API系列的统称。目前最新版本为DirectX 12,随附于Windows 10操作系统之上。
DirectX被广泛用于Microsoft Windows、Microsoft Xbox电子游戏开发,并且只能支持这些平台。除了游戏开发之外,DirectX亦被用于开发许多虚拟三维图形相关软件。Direct3D是DirectX中最广为应用的子模块,所以有时候这两个名词可以互相代称。
DirectX主要基于C++编程语言实现,遵循COM架构。
组件
DirectX组成的组件有:
- Direct3D:主要用于绘制3D图形。
- Direct2D:主要提供2D动画的硬件加速,为DirectDraw的替代者。
- DirectWrite:主要字体显示API,提供使用GPU令字体显示更为平滑,类似ClearType(只支持于Windows Vista/7/8/8.1以上)。
- DirectInput:用于结合键盘、鼠标、摇杆,或其它的游戏控制器。
- XInput:主要用于Xbox 360的控制器。
- XAudio2:主要用于低延迟游戏音频播放。
- DirectCompute:GPU通用计算API。
- DirectXMath:针对游戏优化的高速数学运算API,特别支持单精度浮点运算及矩阵运算,使用SSE2指令集。
- DirectSetup:用于DirectX组件的安装,以及检查DirectX的版本。
- DirectX Media:包含DirectAnimation可用于2D的网页动画,DirectShow可支持多媒体录音以及资料流媒体,DirectX在网页上的转换,还有Direct3D可保留3D图像更清晰的解析。DirectShow亦包含有DirectX插件用于音频信号处理以及DirectX视频加速加速影音播放。
- DirectX媒体对象化:支持资料流对象,像是编码、解码和效果
历史
1994年末,微软即将推出新一代操作系统Windows 95。决定新操作系统的最终价值的因素在于究竟新系统能运行哪些程序。微软的三个员工:Craig Eisler、Alex St. John、Eric Engstrom十分关心这个问题,因为不少游戏程序员更喜欢在DOS系统下编写游戏,这意味着,没有多少人愿意为WIN95编写游戏,新操作系统不会获得多少成功。
DOS允许直接访问显卡、键盘、鼠标、声卡以及其他系统硬件设施。而Windows 95出于保护存储系统的目的,限制了对硬件的直接访问,取而代之的是一套更加规范标准的访问方法。微软需要一种方法让程序员在WIN 95中也能编写出高效的程序。此时,离新系统发布不到几个月了。St. John和Engstrom联合解决了这个问题,他们将解决方案称为DirectX。
DirectX的第一个版本作为Windows Games SDK发布于1995年9月,它作为Windows API的一部分用以替换Windows 3.1中的DCI和WinGAPI。ATI的一个开发团队为微软带来了基本的游戏图像技术,微软方面,DirectX由专门的团队负责开发,Eisler为团队领导,而St. John和Engstrom则成为主程序设计师。
DirectX出现之前,微软已经将OpenGL包括在Windows NT系统中,而在当时,OpenGL对硬件要求严苛,这限制了一些工程师和CAD用户。Direct3D就作为OpenGL的代替品被加入DirectX。随着硬件技术的发展,OpenGL成为行业标准,一场“战役”发生在DirectX的支持者和OpenGL的支持者之间,而且前者只支持Windows平台,而后者支持多平台。在实际应用中,游戏开发者常常两者同时使用,因为DirectX支持许多OpenGL所不支持的功能,比如音效和输入设备。而选择混合使用OpenGL和OpenAL的队伍也在壮大。
由此派生出的“特别DirectX”也作为微软Xbox和Xbox 360的图形API,这套API由微软和NVIDIA公司共同开发,Xbox API和DirectX 8.1比较相似,但跟其他主机科技一样不能更新,Xbox版本也叫做DirectXbox,但由于商业销售缘故,还是被简称为Xbox。
2002年,微软发布了DirectX 9,它支持最新的顶点阴影着色器2.0版本,又于2004年4月将shader model 3.0(SM 3.0)加入了DirectX 9.0c。
2005年4月,DirectShow从DirectX移除,加入到Microsoft Platform SDK。
2010年6月7日发布的DirectX SDK是最后独立发布的SDK版本,之后的DirectX SDK被集成进新版的Microsoft Windows SDK里。例如DirectX 11.2 SDK被放在Windows Software Development Kit (SDK) for Windows 8.1里。
近期版本
- DirectX 10
Windows Vista及以上的操作系统才支持DirectX 10(也就是说,DirectX 9是最后一个支持Windows XP的版本),比起之前的版本,DX10做了重大的变动:增加了XInput用以处理XBOX 360手柄的支持,DirectSound将被XACT替换。DirectX 10也减少了对音效硬件加速的支持,更多的使用CPU来运算音效。
Direct3D 10.1是DirectX 10的改进版,随Vista SP1出货。
- DirectX 11
DirectX 11是DirectX 10的改良,只对性能和扩展性进行优化,主要改进在提供Shader Model 5.0,加入对MSAA的直接采样控制。大幅改进多线程性能,提供三个独立的接口。进一步提高纹理压缩,镶嵌(tessellation)处理的性能,并加入Compute Shader(DirectCompute)来支持GPGPU,提供新版HLSL语言。
DirectX 11.1是DirectX 11的改进版,随Windows 8出货。Windows 7 SP1升级后部分支持。
DirectX 11.2是DirectX 11.1的改进版,随Windows 8.1出货。
- DirectX 12
DirectX 12将更好支持多核心、多线程的优化,降低GPU处理瓶颈,并强化跨平台功能,可有效支持微软各式平台,并提升硬件功耗表现。随Windows 10出货并支持Xbox One。
2019年3月13日,微软于DirectX Developer Blog表示,未来魔兽世界8.1.5的游戏更新将使Windows 7 平台用户也能体验DirectX 12的多线程渲染优势,并提高游戏性能。且未来陆续也会有其他厂商推出相关更新,将更多的D3D12游戏移植到Windows 7。
什么是Direct3D
https://en.wikipedia.org/wiki/Direct3D
Direct3D是微软视窗的一个图形应用编程接口(API)。作为DirectX的一部分,Direct3D被用来在性能重要的应用中渲染三维图形,如游戏。如果显卡上有硬件加速,Direct3D就会使用硬件加速,允许对整个三维渲染管道进行硬件加速,甚至只进行部分加速。Direct3D暴露了3D图形硬件的高级图形功能,包括Z-缓冲、W-缓冲、模板缓冲、空间抗锯齿、alpha混合、颜色混合、mipmapping、纹理混合、剪切、剔除、大气效果、透视校正纹理映射、可编程HLSL着色器和效果。与其他DirectX技术的整合使Direct3D能够提供诸如视频映射、二维叠加平面中的硬件三维渲染,甚至是精灵等功能,提供在互动媒体中使用二维和三维图形的纽带。
Direct3D包含许多用于3D计算机图形渲染的命令;然而,从第8版开始,Direct3D已经取代了DirectDraw框架,也负责2D图形的渲染工作。Direct3D提供了完整的顶点软件仿真,但对于硬件中没有的功能,没有像素软件仿真。例如,如果使用Direct3D编程的软件需要像素着色器,而用户计算机上的显卡不支持该功能,Direct3D将不对其进行仿真,尽管它将计算和渲染3D模型的多边形和纹理,尽管与硬件同等功能相比,质量和性能通常有所下降。API确实包括一个参考光栅器(或REF设备),它在软件中模拟了一个普通的图形卡,尽管它对于大多数实时3D应用来说太慢了,而且通常只用于调试。一个新的实时软件光栅器,WARP,旨在模拟Direct3D 10.1的完整功能集,包含在Windows 7和Windows Vista Service Pack 2的平台更新中;据说其性能与多核CPU上的低端3D卡相当。
作为DirectX的一部分,Direct3D适用于Windows 95及以上版本,并且是不同版本的Xbox控制台系统的矢量图形API的基础。Wine兼容层,一个对几个Windows APIs的自由软件重新实现,包括一个Direct3D的实现。
Direct3D的主要竞争对手是Khronos的OpenGL和其后续的Vulkan。Fahrenheit是微软和SGI在1990年代试图统一OpenGL和Direct3D,但最终被取消。
什么是Direct3D 12
https://docs.microsoft.com/zh-cn/windows/win32/direct3d12/direct3d-12-graphics
DirectX 12引入了下一版本的Direct3D —— 它是DirectX的核心3D图形API。Direct 3D 12比以前的任何版本都更快更高效。Direct 3D 12提供更丰富的场景、更多的对象、更复杂的效果,并且能全面利用现代GPU硬件。
如何使Direct 3D 12更快更高效?
Direct 3D 12提供的硬件抽象级别比以前的版本低,可显著提高标题(或其他应用程序)的多核CPU缩放。一方面,使用Direct 3D 12,你的标题负责自己的内存管理。另一方面,使用Direct 3D 12,你的标题和应用程序可通过命令队列和列表、描述符表和简洁的管道状态对象等功能减少GPU开销。
Direct 3D 12和Direct 3D 11.3引入了呈现管道的一组新功能:
- 传统型光栅化用于启用可靠的命中检测。
- 立体平铺资源用于启用被视为均位于视频内存中的流式处理的三维资源。
- 光栅器有序视图用于启用可靠的透明度呈现。
- 设置着色器中的模具引用来启用特殊阴影和其他效果。
- 改进的纹理映射和类型化无序访问视图(UAV)加载。
在Direct 3D 12中的投入程度如何?
Direct 3D 12为图形开发人员提供四个主要好处(与Direct 3D 11相比):
- 极大地减少了CPU开销。
- 显著减少了电源消耗。
- GPU效率最多(大约)改进了20%。
- Windows 10设备(个人电脑、平板电脑、控制台、移动设备)的跨平台开发。
Direct 3D 12专供高级图形程序员使用。它需要大量图形专业知识和高级别的微调。Direct 3D 12旨在充分利用多线程,仔细的CPU/GPU同步以及资源从一个目的到另一个目的的转换和重复使用。这些技术需要相当多的内存级别的编程技能。
Direct 3D 12的另一个优点是其API资源占用空间较小。大约有200个函数;约三分之一的函数负责繁重的工作。这意味着,图形开发人员应能够向自己提供相关信息—并了解—完整的API集,而无需记住太多的API名称。
除了Direct 3D 12之外,Direct 3D 11仍是一个可行选项。Direct 3D 12的许多新呈现功能在Direct 3D 11.3中可用。Direct 3D 11.3是一个低级别的图形引擎API;而Direct 3D 12的级别更高。
至少有两种方法可供你的开发团队处理Direct 3D 12标题。
以独占方式使用Direct 3D 12
对于充分利用Direct 3D 12的所有好处的项目,应从头开始开发高度自定义的Direct 3D 12引擎。
如果图形开发人员了解标题中资源的使用和重复使用情况,并且可以通过最大限度地减少上传和复制来充分利用这一点,则可以为这些标题开发和自定义高效引擎。性能改进可能非常多,释放CPU时间来增加绘制调用数量,从而使你的图形更加光彩。
在编程方面的投入非常重要,从一开始就应该考虑项目的调试和检测。线程处理、同步和其他计时bug可能颇具挑战性。
将Direct 3D 12与Direct 3D 11一起使用
短期方法是解决Direct 3D 11标题中的已知瓶颈。可以通过使用Direct 3D 12互操作和/或D3D 11 On 12技术(使两个API版本协同工作)来解决这些问题。此方法最大限度地减少现有Direct 3D 11图形引擎所需的更改。但是,性能增益将仅限于解除Direct 3D 12代码处理的瓶颈。
Microsoft DirectX 12(和图形教育)视频
面向图形开发人员的增强教育。这些视频涵盖以下主题:呈现模式、移植到DirectX 12、传统型光栅化、图形工具、Angle、Win2D以及GDC、生成等事件。DirectX 12技术内容以DirectX 12开头。单击此处直接从Direct 3D 12功能团队获得提示和技巧。我们希望帮助你使用最新版本和工具来尽量改进你的游戏!
结论
Direct 3D 12的关键在于显著的图形引擎性能。已缩减易于开发、高级别构造和编译器支持功能来实现这一目的。驱动程序支持和易于调试功能保持为Direct 3D 11的一部分。
Direct 3D 12是一个新领域。正等待好追根究底的专家前来探索。
开发环境
Direct 3D 12标头和库是Windows10 SDK的一部分。使用Direct 3D 12时无需单独下载或安装。
安装Windows10 SDK软件Visual Studio,Direct 3D 12编程环境的设置已完成。Visual Studio 2019,因为它将包含D3D12图形调试工具,但早期版本的Visual Studio适用于程序开发。
若要使用Direct 3D 12 API,请包括D3d12.h并链接到D3d12.lib,或直接在D3d12.dll中查询入口点。
提供了以下标头和库。静态库的位置取决于计算机上运行的Windows 10版本(32位或64位)。
标头或库文件名 | 说明 | 安装位置 |
---|---|---|
D3d12.h | Direct3D 12 API 标头 | %WindowsSdkDir \ 包括 % WindowsSDKVersion% \ \um |
D3d12.lib | 静态 Direct3D 12 API 存根库 | %WindowsSdkDir \ Lib % WindowsSDKVersion% \ \um\arch |
D3d12.dll | 动态 Direct3D 12 API 库 | %WINDIR%\System32 |
D3d12SDKLayers.h | Direct3D 12 调试标头 | %WindowsSdkDir \ 包括 % WindowsSDKVersion% \ \um |
D3d12SDKLayers.dll | 动态 Direct3D 12 调试库 | %WINDIR%\System32 |
支持的语言
C++是Direct 3D 12开发唯一支持的语言,C#和其他.NET语言不受支持。
支持的工具和库
以下库都可用于Direct 3D 12。
库 | 用途 | 文档 |
---|---|---|
用于DirectX 12的DirectX工具包 | 用于为通用Windows平台(UWP)应用、适用于Windows10的Win32桌面应用程序和XboxOne独占应用编写Direct3D12C++代码的帮助程序类的大量集合。 | DirectX 12TK wiki |
DirectXTex | 适用于读取和写入DDS文件,以及执行各种纹理内容处理操作,包括调整大小、格式转换、mip贴图生成、Direct3D运行时纹理资源的块压缩和高度贴图到法线贴图的转换。 | DirectXTex wiki |
DirectXMesh | 适用于执行各种几何图形内容处理操作,包括生成法线和切线帧、三角形相邻计算和顶点缓存优化。 | DirectXMesh wiki |
DirectXMath | 支持矢量、标量、矩阵、四元数和许多其他数学运算的大量帮助程序类和方法。 | MSDN上的DirectXMath 文档 |
UVAtlas | 适用于创建和打包isochart纹理图集。 | UVAtlas wiki |