在渲染过程中,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. Android Studio Terminal 常用命令

    一.Manifest merger failed with multiple errors, see logs 在android开发的时候,有时候会遇到这样的问题 Error:Execution fa ...

  2. vue 创建项目 create和init

    vue init是vue-cli2.x的初始化方式,可以使用github上面的一些模板来初始化项目,webpack是官方推荐的标准模板名. 示例:vue init webpack myproject ...

  3. Malloc Maleficarum复盘

    1.hos复盘 hos即伪造堆块,free栈上地址,然后下一个malloc去分配一个fastbin(栈上),包含返回地址. 代码来源 他这个我直接复现有问题,咨询了joker师傅,应该是gcc版本问题 ...

  4. Dungeon Master (POJ - 2251)(BFS)

    转载请注明出处: 作者:Mercury_Lc 地址:https://blog.csdn.net/Mercury_Lc/article/details/82693907 题目链接 题解:三维的bfs,一 ...

  5. Python基础之Python介绍

    Python的创始人为吉多·范罗苏姆(Guido Van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语言的一种继承. 最新 ...

  6. JavaWeb_(Hibernate框架)Hibernate与c3p0与Dbutils的区别

    JavaWeb_(Hibernate框架)使用Hibernate开发用户注册功能 传送门 JavaWeb_(Hibernate框架)使用c3p0与Dbutils开发用户注册功能 传送门 Hiberna ...

  7. TypeScript----函数与类

    TypeScript中的类 传统的JavaScript程序使用函数和基于原型的继承来创建可重用的组件,但对于熟悉使用面向对象方式的程序员来讲就有些棘手,因为他们用的是基于类的继承并且对象是由类构建出来 ...

  8. log4j 多进程配置要注意的

    多进程写日志文件 方法一: 解决log4j公用配置文件,多进程同时写同一个log文件,因存在操作系统pv操作问题, 导致部分日志丢失.解决方案是不同的进程写不同的log文件 测试于:Log4j 1.2 ...

  9. [洛谷P3942]:将军令(贪心)

    题目传送门 题目背景 历史/落在/赢家/之手至少/我们/拥有/传说谁说/败者/无法/不朽拳头/只能/让人/低头念头/却能/让人/抬头抬头/去看/去爱/去追你心中的梦 题目描述 又想起了四月.如果不是省 ...

  10. vue中如何刷新页面

    vue中刷新页面的方法 1. 不能使用 this.$router.go(0) 或者 window.reload() 不起作用还特别恶心 这个才是有效果的刷新页面,只要照图敲,就能有效果 我们在 app ...