Browse Source

feat: 添加描述符和描述符堆的说明

nicetry12138 1 year ago
parent
commit
9579f3918c
1 changed files with 55 additions and 0 deletions
  1. 55 0
      图形学/DirectX学习/README.md

+ 55 - 0
图形学/DirectX学习/README.md

@@ -723,3 +723,58 @@ ThrowIfFailed(md3dDevice->CreateFence(0, D3D12_FENCE_FLAG_NONE, IID_PPV_ARGS(&mF
 
 9.  资源和视图
 
+```cpp
+void D3DApp::CreateRtvAndDsvDescriptorHeaps()
+{
+    D3D12_DESCRIPTOR_HEAP_DESC rtvHeapDesc;
+    rtvHeapDesc.NumDescriptors = SwapChainBufferCount;
+    rtvHeapDesc.Type = D3D12_DESCRIPTOR_HEAP_TYPE_RTV;
+    rtvHeapDesc.Flags = D3D12_DESCRIPTOR_HEAP_FLAG_NONE;
+	rtvHeapDesc.NodeMask = 0;
+    ThrowIfFailed(md3dDevice->CreateDescriptorHeap(
+        &rtvHeapDesc, IID_PPV_ARGS(mRtvHeap.GetAddressOf())));
+
+
+    D3D12_DESCRIPTOR_HEAP_DESC dsvHeapDesc;
+    dsvHeapDesc.NumDescriptors = 1;
+    dsvHeapDesc.Type = D3D12_DESCRIPTOR_HEAP_TYPE_DSV;
+    dsvHeapDesc.Flags = D3D12_DESCRIPTOR_HEAP_FLAG_NONE;
+	dsvHeapDesc.NodeMask = 0;
+    ThrowIfFailed(md3dDevice->CreateDescriptorHeap(
+        &dsvHeapDesc, IID_PPV_ARGS(mDsvHeap.GetAddressOf())));
+}
+```
+
+以 `RTV`(`Render Target View`,**渲染目标视图**) 和 `DSV`(`Depth Stencil View`,**深度模板视图**) 为例
+
+这里通过 `D3D12_DESCRIPTOR_HEAP_DESC` 堆描述结构体,来描述一个堆,然后通过 `device` 来创建这个描述符堆,例如:`rtvHeapDesc` 和 `dsvHeapDesc`
+
+常用的描述符有:
+
+- `CBV`(constant buffer view):常量缓冲区视图
+- `SRV`(shader resource view):着色器资源视图
+- `UAV`(unorder access view):无序访问视图
+- `Sampler`:采样器,用于采样纹理资源
+- `RTV`(render target view):渲染目标视图
+- `DSV`(depth/stencil view):深度/模板视图
+
+描述符堆(Descriptor Heap)是一种关键的资源管理工具,用于存储和组织资源描述符。资源描述符是指向资源(如纹理、缓冲区、采样器等)的句柄或指针,它提供了 GPU 所需的足够信息来访问这些资源
+
+描述符堆实际上就是存放描述符的数组,本质上是存放特定类型描述符的一块内存
+
+关于[D3D12_DESCRIPTOR_HEAP_DESC](https://learn.microsoft.com/zh-cn/windows/win32/api/d3d12/ns-d3d12-d3d12_descriptor_heap_desc)的各个属性文档中有比较的说明
+
+描述符堆具体是存储什么描述符是通过 `D3D12_DESCRIPTOR_HEAP_DESC` 的 `Type` 属性来决定的
+
+- `D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV`: 可以存放CBV, SRV和UAV
+- `D3D12_DESCRIPTOR_HEAP_TYPE_SAMPLER`: 存放sampler
+- `D3D12_DESCRIPTOR_HEAP_TYPE_RTV`: 存放RTV
+- `D3D12_DESCRIPTOR_HEAP_TYPE_DSV`: 存放DSV
+
+描述符堆的 `Flag` 属性用来指定描述符堆的可见性,即可以被哪些管线阶段访问
+
+- `D3D12_DESCRIPTOR_HEAP_FLAG_NONE`: 创建只由 CPU 访问的描述符堆,例如专门用于渲染目标视图(RTV)或深度模板视图(DSV)的描述符堆
+- `D3D12_DESCRIPTOR_HEAP_FLAG_SHADER_VISIBLE`: 述符堆可以被着色器程序直接访问
+
+> RTVs 和 DSVs 在常规渲染流程中不需要由着色器直接访问,因为它们通常是由输出合并阶段使用
+