首先推荐amebabyRockSun_QQ的《DirectX12(D3D12)基础教程(二)——理解根签名、初识显存管理和加载纹理、理解资源屏障》
链接:https://blog.csdn.net/u014038143/article/details/83067300
教会了我不少关于根签名的知识。
经过2天的学习,大致了解了根签名是一种怎样的东西。暂时先以以下这种方式这理解,如果有后续更改会直接修改的。(也许错到离谱……(真的在好好学习的小伙伴就别看了),先这么记录了。)
- GPU上有很多寄存器,比如t,比如b,比如s。
- 每个寄存器有很多位置,比如b1,b2
- 一个着色器在定义上就表明自己会在哪个寄存器上找资源,比如cbuffer obPerObject :register(b0)
- 到了渲染的时候,着色器要去各种寄存器上取资源的时候,我们要把资源放到寄存器上面去。
- 所以在渲染之前,就用SetGraphicsRootDescriptorTable方法,把【这函数参数的结构】和【各种资源、位置、大小、类型等信息(就是描述符)】绑定起来。
- 所以在使用SetGraphicsRootDescriptorTable之前,我们要使用SetGraphicsRootSignature方法和SetDescriptorHeap的方法,知道【这函数参数的结构】(用index)和【各种资源、位置、大小、类型等信息(就是描述符)】(描述符指针地址) 的源数据是哪里。因为有很多根签名,也有很多描述符。
- 根据根签名定义的参数结构去取得资源。具体取得的过程需要借助述符的数据。
- 描述符会指定资源数据,还会告知资源即将被绑定在流水线的哪个阶段上。
- 取得数据会放到寄存器上,然后着色器会依次使用它们。
- 完成渲染。
不过不知不觉又产生了对描述符的疑问。描述符也是在流水线开始前就创建了的。但是资源不能与渲染流水线的阶段直接绑定,所以要为资源创建视图(描述符),并将其绑定到流水线阶段。这个创建是一劳永逸的吗?
在创建视图时,我们把这个描述符和资源绑定起来(视图其实就是这个意思)。 BuildConstantBufferViews() 这件事也需要在draw之前。
视图像是绑定这两者。(一边是之前建立的描述符,一边是资源数据地址)