【译】Import Changes from Direct3D 11 to Direct3D 12
译者:林公子
出处:木木的二进制人生
转载请注明作者和出处,谢谢!
这是微软公布的Direct3D 12文档的其中一篇,此翻译留作学习记录备忘,水平有限,错漏难免,还望海涵。
原文链接是https://msdn.microsoft.com/en-us/library/windows/desktop/dn899194(v=vs.85).aspx
Direct3D 12到Direct3D 11的重大改变
Direct3D 12是对Direct3D 11编程模型的一个巨大颠覆。Direct3D 12让应用程序比以往更接近硬件底层。通过接近底层,Direct3D 12更加的快速和高效。不过你的应用程序使用Direct3D 12带来的速度和效率提升相应的代价是你要比使用Direct3D 11负责更多的工作。
Direct3D 12是底层编程的回归。通过引入这些新特性,它给予你对游戏和应用程序中图形元素的更多的控制: 用于代表管线整体状态的的对象,用于任务提交的command list和bundles,用于资源访问的descriptor heap/table。
Direct3D 12 vs Direct3D 11的取舍
使用Direct3D 12你的应用程序的速度和效率得到了提升,不过你要负责相对与Direct3D 11更多的工作。
l 在Direct3D 12中,CPU-GPU的同步明确由应用程序负责,不再像Direct3D 11中由运行时隐式执行。这也意味着Direct3D 12没有对pipeline hazard的自动检查,因此这也成为了应用程序的职责。
l 在Direct3D 12中,应用程序负责管线数据更新。也就是Direct3D 11中的"Map/Lock-Discard"模式在Direct3D 12中必须手动进行。在Direct3D 11中,当你使用D3D11_MAP_WRITE_DISCARD标识调用ID3D11DeviceContext::Map时,运行时返回一个新内存区块的指针代替旧的缓冲数据。这让GPU能够在应用程序往新缓冲填充数据的同时使用旧的数据。应用程序不需要额外的内存管理。旧的缓冲在GPU使用完后会自动销毁或重用。
l 在Direct3D 12中,所有的动态更新(包括constant buffer,dynamic vertex buffer,dynamic textures等等)明确由应用程序来控制。这些动态更新包括任何请求的GPU fence和buffer。应用程序有责任保证内存在使用完之前是有效的。
l Direct3D 12只将COM风格的引用计数用于interface的生命周期(通过Direct3D的弱引用模型关联到device的生命周期)。所有的resource和description内存生命周期由应用程序来负责保证适当的存活时间,而且它们都没有使用引用计数。Direct3D 11也使用引用计数来管理interface相关的对象。
管线状态对象
Direct3D11允许使用大量独立的对象的集合来操纵管线状态。例如,input assembler state,pixel shader state,rasterizer state和output merge state都能够独立的进行修改。这种设计提供了便利性和相对高层的图形管线表示。但是没有利用现代硬件的能力。主要是各种各样的state通常是互相关联的。例如,很多GPU将pixel shader和output merger state合并为一个硬件表示。然而因为Direct3D 11 API这些管线阶段状态被分别设置,显示驱动不能决议管线状态直到状态最后确定下来,而这要等到绘制的时候。这种规划延迟了硬件的状态设置,也就意味着额外的开销和更少的每帧DP。
Direct3D 12通过将大部分管线状态统一到不可变的管线状态对象(PSOs)来解决这个问题,PSOs在创建的时间就决定了。硬件和驱动能够立即将PSO转换为用来驱动GPU工作的硬件本地指令和状态。你仍然可以动态切换使用的PSO。这么做硬件只需要直接拷贝最少的预计算状态到硬件寄存器,而不是实时计算硬件状态。通过使用PSOs,DP的开销显著的减少,然后每帧可以有更多的DP。更多关于PSOs的信息见Managing graphics pipeline state in Direct3D 12. 。
命令列表和集合(bundle)
在Direct3D 11中,所有的任务提交都通过immediate context完成,immediate context代表了一条送往GPU的指令流。要实现多线程,游戏还有deferred context可以使用。Direct3D 11中的Deferred Context不能完美的映射到硬件,所以它们能做的事情有限。
Direct3D 12引入了给予命令列表的任务提交模型。命令列表包含了在GPU上执行一个具体工作所需的所有信息。每个命令列表包含的信息有使用哪个PSO,需要什么纹理和缓冲资源和所有DP的参数。因为每个命令列表是自包含的并且没有状态继承。驱动能够预先计算所有需要的GPU命令,并且是以一种自由线程化(free-threaded)的方式。接下来唯一需要进行的处理是通过命令队列将命令列表最终提交到GPU。
除了命令列表,Direct3D 12还引入了一个二级的任务预计算方式:bundle。不像命令列表,完全的自包含,一般性的被构造,提交一次然后丢弃,bundle提供了某种形式的状态继承来允许复用。例如,如果游戏想要用不同的纹理绘制两个角色模型。一种方法是用一个命令列表记录两组完整一样的DP。另一种方法是记录一个绘制单一角色模型的bundle,然后用不同的资源在命令列表上“回放”bundle两次。在后一种情况下,显示驱动只需要计算相应的指令一次,而创建命令列表本质上相当于两个低开销的函数调用。
。
描述符堆和表(Descriptor Heap and Table)
Direct3D 11中的资源绑定高度抽象和便利,却留下很多现代硬件能力没有被利用到。在Direct3D 11中,游戏创建资源的视图对象,然后绑定这些视图到管线中不同shader阶段的slot中。然后Shader从显式绑定的 slot读取数据,这些绑定slot在绘制时是固定的。这个模型意味着每当游戏使用不同的资源绘制,它必须重新绑定不同的视图到不同的slot,然后再次调用绘制函数。这种情况也表现出额外的开销能够通过完全利用硬件能力来消除。
Direct3D 12改变了绑定模型来匹配现代硬件并显著的提升了性能。和需要独立的资源视图和显式的绑定到slot相反,Direct3D 12提供了一个descriptor heap用来创建游戏中不同的资源。这个方案提供了一种机制让GPU预先直接写入硬件本地资源描述(descriptor)到内存。因为descriptor heap已经被恰当的特定于硬件的descriptor数据填充,改变descriptor table是消耗相当低的操作
除了由descriptor heap和table带来的性能提升。Direct3D 12还允许资源在shader里被动态的索引,这提供了空前的灵活性并开启了新渲染技术的大门。举例来说,现代延迟渲染引擎一般将一个某种形式的材质或物体标识符编码到中间的G-Buffer。在Direct3D 11中,这些引擎必须小心的避免使用太多的材质,因为在一个G-Buffer中包含太多会极大的影响最终渲染pass的速度。有了能动态索引的资源,一个有上千材质的场景能够最终和只有十个材质的场景一样快。
更多关于descriptor head和table的信息,见Resource Binding。
【译】Import Changes from Direct3D 11 to Direct3D 12的更多相关文章
- [转]Direct3D 11 Tessellation Tutorial
The new hardware tessellation feature available on Direct3D 11 video cards has great potential, but ...
- Direct3D 11 Tutorial 7:Texture Mapping and Constant Buffers_Direct3D 11 教程7:纹理映射和常量缓冲区
概述 在上一个教程中,我们为项目引入了照明. 现在我们将通过向我们的立方体添加纹理来构建它. 此外,我们将介绍常量缓冲区的概念,并解释如何使用缓冲区通过最小化带宽使用来加速处理. 本教程的目的是修改中 ...
- Direct3D 11 Tutorial 5: 3D Transformation_Direct3D 11 教程5:3D转型
概述 在上一个教程中,我们从模型空间到屏幕渲染了一个立方体. 在本教程中,我们将扩展转换的概念并演示可以通过这些转换实现的简单动画. 本教程的结果将是围绕另一个轨道运行的对象. 展示转换以及如何将它们 ...
- Direct3D 11 Tutorial 4: 3D Spaces_Direct3D 11 教程4:3D空间
概述 在上一个教程中,我们在应用程序窗口的中心成功渲染了一个三角形. 我们没有太注意我们在顶点缓冲区中拾取的顶点位置. 在本教程中,我们将深入研究3D位置和转换的细节. 本教程的结果将是渲染到屏幕的3 ...
- Direct3D 11 Tutorial 3: Shaders and Effect System_Direct3D 11 教程3:着色器和效果系统
概述 在上一个教程中,我们设置了一个顶点缓冲区并将一个三角形传递给GPU. 现在,我们将逐步完成图形管道并查看每个阶段的工作原理. 将解释着色器和效果系统的概念. 请注意,本教程与前一个源代码共享相同 ...
- Direct3D 11 Tutorial 2: Rendering a Triangle_Direct3D 11 教程2:渲染一个三角形
概要 在之前的教程中,我们建立了一个最小的Direct3D 11的应用程序,它用来在窗口上输出一个单一颜色.在本次教程中,我们将扩展这个应用程序,在屏幕上渲染出一个单一颜色的三角形.我们将通过设置数据 ...
- Direct3D 11 Tutorial 1: Basics_Direct3D 11 教程1:基础
Github-LearnDirectX-DX3D11 tutorial01 概述 在这第一篇教程中,我们将通过介绍创建最小Direct3D应用程序所必需的元素.每一个Direct3D应用程序必需拥有这 ...
- WeihanLi.Npoi 1.11.0/1.12.0 Release Notes
WeihanLi.Npoi 1.11.0/1.12.0 Release Notes Intro 最近 NPOI 扩展新更新了两个版本,感谢 shaka chow 的帮忙和支持,这两个 Feature ...
- 【C++】使用 libass,完成 Direct3D 11 下的字幕渲染
前言 前段时间曾经写过一个视频播放器:https://www.cnblogs.com/judgeou/p/14746051.html . 然而这个播放器却无法显示出外挂或者内封的字幕,这里要稍微解释一 ...
随机推荐
- npm link 安装本地模块,将本地模块cli化
第三方学习地址 http://mp.weixin.qq.com/s?__biz=MzAxMTU0NTc4Nw==&mid=2661157390&idx=1&sn=6d96e54 ...
- 安卓中級教程(5):ScrollView與refreshable之間的設置
設置向下拉動更新. package com.mycompany.Scroll_test; import android.app.*; import android.os.*; import andro ...
- 【iCore3应用开发平台】发布 iCore3 应用开发平台PID控制代码
说明:1.本代码包包含FPGA和STM32F407两部分内容2.FPGA工程为出厂代码FPGA工程,版本为REV43.STM32F407为只含PID控制的ARM工程4.在使用风扇过程中,请勿将手伸入扇 ...
- 阿里云服务器Linux CentOS安装配置(一)购买阿里云服务器
阿里云服务器Linux CentOS安装配置(一)购买阿里云服务器 我在阿里云购买的服务器配置 CPU:1核 内存:2G 系统盘:40G 公共镜像:CentOS 6.5 64位 公网带宽:1Mbps ...
- xcode8升级后问题总汇
一.注释快捷键无法使用 command + / 快捷键无法使用,在终端执行以下命令,然后重启Xcode即可. 1 sudo /usr/libexec/xpccachectl 二.注释快捷键 Xco ...
- WireShar使用笔记
1.下载wiresharp 官网下载 2.安装 安装后直接支持中文 很人性化哦 注意:一定要安装WinPcap 不然无法使用 3.
- SQLServer一次性删除重复的数据
delete from [GCPCore].[GCP.Product].[CityMall] where AreaID in(select AreaID from [GCPCore].[GCP.Pr ...
- BasicDataSource的配置参数
参数 描述 username 传递给JDBC驱动的用于建立连接的用户名 password 传递给JDBC驱动的用于建立连接的密码 url 传递给JDBC驱动的用于建立连接的URL driverClas ...
- EntityFramework优缺点
高层视图: 改变在现有系统使用EntityFramework的优势是什么? • All -in-1框架的类映射表,需要编写映射代码, 并且是很难维护的. • 可维护性,易于理解的代码,无需创造大的数据 ...
- Python学习【第九篇】函数
函数 函数是什么? 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 在学习函数之前,一直遵循:面向过程编程,即:根据业务逻辑从上而下实现功能,其往往用一段代码来实现指定功能,开发过 ...