【D3D12学习手记】4.1.6 Resources and Descriptors
在渲染过程中,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的更多相关文章
- 【D3D12学习手记】The Command Queue and Command Lists
GPU有一个命令队列,CPU通过Direct3D API将命令提交到队列里来使用命令列表(command lists),如下图.当一套命令(a set of commands)已经被提交到命令队列,他 ...
- 【D3D12学习手记】4.3.8 Create the Depth/Stencil Buffer and View
我们现在需要创建深度/模板缓冲区. 如§4.1.5所述,深度缓冲区只是一个2D纹理,用于存储最近的可见对象的深度信息(如果使用模板(stencil),则也会存储模板信息). 纹理是一种GPU资源,因此 ...
- 【D3D12学习手记】The Swap Chain and Page Flipping
为了避免动画中的闪烁,最好将整个动画帧绘制到称为后台缓冲区的屏幕外纹理(off-screen texture)中.一旦整个场景被绘制到给定动画帧的后缓冲区,它就作为一个完整的帧呈现给屏幕;以这种方式, ...
- 【D3D12学习手记】CPU/GPU Synchronization
由于有两个并行运行的处理器(CPU和GPU),会出现许多同步问题.假设我们有一些资源R存储了我们希望绘制的某些几何体的位置. 此外,假设CPU更新R的数据以存储位置p1,然后将引用R的绘图命令C添加到 ...
- Linux.NET学习手记(7)
前一篇中,我们简单的讲述了下如何在Linux.NET中部署第一个ASP.NET MVC 5.0的程序.而目前微软已经提出OWIN并致力于发展VNext,接下来系列中,我们将会向OWIN方向转战. 早在 ...
- Linux.NET学习手记(8)
上一回合中,我们讲解了Linux.NET面对OWIN需要做出的准备,以及介绍了如何将两个支持OWIN协议的框架:SignalR以及NancyFX以OwinHost的方式部署到Linux.NET当中.这 ...
- 关于《Linux.NET学习手记(8)》的补充说明
早前的一两天<Linux.NET学习手记(8)>发布了,这一篇主要是讲述OWIN框架与OwinHost之间如何根据OWIN协议进行通信构成一套完整的系统.文中我们还直接学习如何直接操作OW ...
- EF框架学习手记
转载: [ASP.NET MVC]: - EF框架学习手记 1.EF(Entity Framework)实体框架EF是ADO.NET中的一组支持开发面向数据的软件应用程序的技术,是微软的一个ORM框架 ...
- ExtJS MVC 学习手记3
在演示应用中,我们已经创建好了viewport,并为之添加了一个菜单树.但也仅仅是这样,点击树或应用的其他地方获得不到任何响应.这个演示应用还是一个死的应用. 接下来,我们让这个应用活起来. 首先,给 ...
随机推荐
- Mike and Feet CodeForces - 548D (单调栈)
Mike is the president of country What-The-Fatherland. There are n bears living in this country besid ...
- zencart产品批量表上传后SEO三要素状态以及特价时间修改
', metatags_products_name_status ', metatags_model_status ', metatags_price_status ', metatags_title ...
- socket链接的关闭连接与close和shutdown的区别
TCP主动关闭连接 appl: close(), --> FIN FIN_WAIT_1 //主动关闭socket方,调用close关闭socket,发FIN <-- ACK FIN_WAI ...
- 查看ocx控件CLSID的方法(转载)
CLSID就是classID类的标识码 1.打开注册表,window + r ,输入regedit,确定 2.点击 编辑 选择查找 3.ok拉 参考:https://blog.csdn.net/u01 ...
- go学习开篇
我是做java开发的,从接触java开始算,已经8年了,为什么会想到学go语言呢?前端时间我一直在学习jvm,java的一些更底层的东西,梳理回顾时,感觉可以通过学习其他开发语言,来提 ...
- python 2 和python 3 中的编码对比
在 Python 中,不论是 Python2 还是 Python3 中,总体上说,字符都只有两大类: 通用的 Unicode 字符: (unicode 被编码后的)某种编码类型的字符,比如 UTF-8 ...
- 使用OmniDiskSweeper清理MAC
Mac 经常提示我磁盘空间已满,管理磁盘空间. 然后我就管理了一下,发现系统竟占90个G,有点懵逼.然后网上查了资料 使用了一个名叫OmniDiskSweeper的超级强大的工具,而且还是免费的,它能 ...
- ajax给增删修加入非空
<span>标签加入 <script type="text/javascript"> $(".inp2").click(function ...
- WTL自定义控件:edit内容改变响应
头文件内容: BEGIN_MSG_MAP(myEdit) COMMAND_CODE_HANDLER_EX(EN_CHANGE, OnEnChange) END_MSG_MAP()4 void OnEn ...
- freemarker页面静态化
1.工程结构 2. Student public class Student { private int id; private String name; private String address ...