D3D12中涉及资源绑定的关键部分是描述符(descriptor),描述符表(desciptor table),描述堆(descriptor heap)和根签名(root signature)。
资源和图形管线
Shader资源(诸如贴图,常量表,图片,缓冲等等)并非是直接绑定在shader管线上,而是通过描述符(descriptor)知名的。一个描述符包含一个资源的所有信息。
描述符会组合到一起形成描述符表(descriptor table)。每个描述符表储存某一(多)类型的资源信息。常见的资源有:
- Constant buffer views(CBVs)
- Unordered access views(UAVs)
- Shader resource views(SRVs)
- Samplers
CBVs,UAVs和SRVs可以被合并在同一个描述符表里。
图形和计算管线通过索引定位描述符表访问资源。
描述符表储存在一个描述符堆(descriptor heap)里。根签名是一种绑定规范(binding convention),shader通过其定位所需的资源。根签名储存了:
- 到描述符表的索引,索引通过描述符表的layout提前定义。
- 常量,使得用户定义的常量可以在shader中使用。
- 有一小部分的描述符是直接谓语根签名内的,比如每次draw丢在变化的常量缓冲视图(CBV),就避免了每次都要把这些描述符存进描述符堆里。
D3D12中设计绑定资源是独立于其他任务的存在。
资源类型和视图
资源类型和D3D11一样:
- Texture1D, and Texture1DArray
- Texture2D, and Texture2DArray, Texture2DMS, Texture2DMSArray
- Texture3D
- Buffers (typed, structured and raw)
资源视图则和11有稍许不同,多出了顶点和索引缓冲视图。:
- Constant buffer view (CBV)
- Unordered access view (UAV)
- Shader resource view (SRV)
- Samplers
- Render Target View (RTV)
- Depth Stencil View (DSV)
- Index Buffer View (IBV)
- Vertex Buffer View (VBV)
- Stream Output View (SOV)
只有前四个是对shader可见的。
资源绑定流程
- 创建一/多个根签名对象
- 创建要用到的根签名对象的shader和管线状态
- 创建一/多个描述符堆,内含SRV,UAV和CBV描述符
- 初始化描述符堆
时间: 2024-10-08 16:45:16