在渲染过程中,GPU将写资源(resources)(例如,后缓冲区,深度/模板缓冲区),读资源(例如,描述表面外观的纹理,存储场景中几何体3D位置的缓冲区)。在我们发出绘图命令之前,我们需要将资源绑定(或链接)(bind (or link))到将在该绘制调用中引用的渲染管道。有些资源可能每次绘制被调用时都会变化,因此我们需要在必要时更新每个绘制调用(draw call)的绑定。但是,GPU资源不是直接被绑定的。相反,资源是通过描述符对象(descriptor object)引用的,可以将其视为描述GPU资源的轻量级结构。从本质上讲,它是间接的一层(a level of indirection);给定资源描述符,GPU可以获得实际的资源数据并知道有关它的必要信息。我们通过指定将在draw call中引用的描述符将资源绑定到呈现管道。

为什么要使用描述符这种额外的间接层次?原因是GPU资源本质上是通用的内存块。资源保持通用,因此可以在渲染管道的不同阶段使用它们;一个常见的例子是使用纹理作为渲染目标(即,Direct3D绘制到纹理中),然后又被用作着色器(shader)资源(即,纹理将被采样并用作着色器的输入数据)。资源本身并不表示它是否被用作渲染目标,深度/模板缓冲区或着色器资源。另外,也许我们只想将资源数据的子区域绑定到渲染管道 - 我们如何在给定整个资源的情况下做到这一点?此外,可以使用无类型格式创建资源,因此GPU甚至不知道资源的格式。

这是描述符的来历。除了识别资源数据之外,描述符还向GPU描述资源:它们告诉Direct3D资源将如何使用(即,您将绑定它到管道的哪个阶段),在适用的情况下可以指定我们想要在描述符中绑定的资源的子区域,如果资源格式在创建时被指定为无类型,那么我们现在必须在创建描述符时声明类型。

旁注:视图(view)是描述符(descriptor)的同义词。 术语“视图”在Direct3D的早期版本中使用,它仍然在Direct3D 12 API的某些部分中使用。 我们在本书中互换使用; 例如,常量缓冲区视图和常量缓冲区描述符是同一回事。

描述符有一个类型,类型暗示了资源的使用方式。我们在本书中使用的描述符类型是:
1.CBV / SRV / UAV描述符描述了常量缓冲区(constant buffers),着色器资源(shader resources)和无序访问视图资源(unordered access view resources)。
2.采样器描述符(Sampler descriptors)描述采样器资源(用于纹理化(texturing))。
3.RTV描述符描述渲染目标资源。
3.DSV描述符描述深度/模板(depth/stencil)资源。

描述符堆(a descriptor heap)是描述符的数组(array );它是应用程序使用的特定类型的所有描述符的内存支持。对于每种类型的描述符,您将需要单独的描述符堆。您还可以创建相同描述符类型的多个堆。

我们可以有多个描述符引用相同的资源。例如,我们可以有多个描述符引用资源的不同子区域。而且,如上所述,资源可以绑定到渲染管道的不同阶段。对于每个阶段,我们需要一个单独的描述符。对于使用纹理作为渲染目标和着色器资源的示例,我们需要创建两个描述符:RTV类型描述符和SRV类型描述符。类似地,如果您使用无类型格式创建资源,则可以将纹理的元素视为浮点值或整数,例如;这将需要两个描述符,其中一个描述符指定浮点格式,另一个描述符指定整数格式。

应在初始化时创建描述符。这是因为发生了一些类型检查和验证(This is because there is some type checking and validation that occurs),最好在初始化时而不是运行时执行此操作。

旁注:2009年8月的SDK文档说:“创建完全类型的资源(fully-typed resource)会将资源限制为它创建时的格式。 这使得运行时能够优化访问[...]。“因此,如果您确实需要它们提供的灵活性(能够以多种方式使用多个视图重新解释数据),您应该只创建无类型资源; 否则,创建一个完全类型的资源。

【D3D12学习手记】4.1.6 Resources and Descriptors的更多相关文章

  1. 【D3D12学习手记】The Command Queue and Command Lists

    GPU有一个命令队列,CPU通过Direct3D API将命令提交到队列里来使用命令列表(command lists),如下图.当一套命令(a set of commands)已经被提交到命令队列,他 ...

  2. 【D3D12学习手记】4.3.8 Create the Depth/Stencil Buffer and View

    我们现在需要创建深度/模板缓冲区. 如§4.1.5所述,深度缓冲区只是一个2D纹理,用于存储最近的可见对象的深度信息(如果使用模板(stencil),则也会存储模板信息). 纹理是一种GPU资源,因此 ...

  3. 【D3D12学习手记】The Swap Chain and Page Flipping

    为了避免动画中的闪烁,最好将整个动画帧绘制到称为后台缓冲区的屏幕外纹理(off-screen texture)中.一旦整个场景被绘制到给定动画帧的后缓冲区,它就作为一个完整的帧呈现给屏幕;以这种方式, ...

  4. 【D3D12学习手记】CPU/GPU Synchronization

    由于有两个并行运行的处理器(CPU和GPU),会出现许多同步问题.假设我们有一些资源R存储了我们希望绘制的某些几何体的位置. 此外,假设CPU更新R的数据以存储位置p1,然后将引用R的绘图命令C添加到 ...

  5. Linux.NET学习手记(7)

    前一篇中,我们简单的讲述了下如何在Linux.NET中部署第一个ASP.NET MVC 5.0的程序.而目前微软已经提出OWIN并致力于发展VNext,接下来系列中,我们将会向OWIN方向转战. 早在 ...

  6. Linux.NET学习手记(8)

    上一回合中,我们讲解了Linux.NET面对OWIN需要做出的准备,以及介绍了如何将两个支持OWIN协议的框架:SignalR以及NancyFX以OwinHost的方式部署到Linux.NET当中.这 ...

  7. 关于《Linux.NET学习手记(8)》的补充说明

    早前的一两天<Linux.NET学习手记(8)>发布了,这一篇主要是讲述OWIN框架与OwinHost之间如何根据OWIN协议进行通信构成一套完整的系统.文中我们还直接学习如何直接操作OW ...

  8. EF框架学习手记

    转载: [ASP.NET MVC]: - EF框架学习手记 1.EF(Entity Framework)实体框架EF是ADO.NET中的一组支持开发面向数据的软件应用程序的技术,是微软的一个ORM框架 ...

  9. ExtJS MVC 学习手记3

    在演示应用中,我们已经创建好了viewport,并为之添加了一个菜单树.但也仅仅是这样,点击树或应用的其他地方获得不到任何响应.这个演示应用还是一个死的应用. 接下来,我们让这个应用活起来. 首先,给 ...

随机推荐

  1. kotlin默认参数和具名参数

    纯语法操练,这里先定义一些数学计算公式,顺便来复习复习,如下: 然后编写测试代码来调用下它们: 编译运行: 但是!!!对于这四个函数都有一个参数是pi: 而实际上它是一个常量,可以手动给它定义一个默认 ...

  2. Google Protocol Buffer入门

    简介 Google Protocol Buffer( 简称 Protobuf) 是 Google 公司内部的混合语言数据标准,目前已经正在使用的有超过 48,162 种报文格式定义和超过 12,183 ...

  3. 多个Promise执行顺序

    app.isLogin() // 判断是否登录后 .then(res=>{ this.setData({ login: true }, res2=>{ // 清空临时积分 return a ...

  4. ingress部署

    # 手动部署 # 部署ingress-nginx 官方地址:https://github.com/kubernetes/ingress-nginx # 参考链接:https://www.jianshu ...

  5. Mysql历史版本下载地址

    Mysql历史版本下载地址:http://downloads.mysql.com/archives/community/

  6. python创建文件夹方法

    def mkdir(path): # 引入模块 import os # 去除首位空格 path = path.strip() # 去除尾部 \ 符号 path = path.rstrip(" ...

  7. 微信小程序_(组件)可拖动movable-view

    微信小程序movable-view组件官方文档 传送门 Learn 一.moveable-view组件 一.movable-view组件 direction:movable-view的移动方向,属性值 ...

  8. [JZOJ5400]:Repulsed(贪心+树形DP)

    题目描述 小$w$心里的火焰就要被熄灭了. 简便起见,假设小$w$的内心是一棵$n-1$条边,$n$个节点的树. 现在你要在每个节点里放一些个灭火器,每个节点可以放任意多个. 接下来每个节点都要被分配 ...

  9. SolrCloud配置

    一.简介 Apache Solr是基于Lucene的全文搜索引擎.如何让Solr具有容错性和高可用性,SolrCloud可以帮助我们搭建集群,提供分布式索引,以及自动备份.SolrCloud是Solr ...

  10. slub分配object

    kmem_cache如下: 62struct kmem_cache { struct kmem_cache_cpu __percpu *cpu_slab; /* Used for retriving ...