Explorar o código

feat: 修改描述符的解释位置

nicetry12138 hai 1 ano
pai
achega
d9318b27d8
Modificáronse 1 ficheiros con 46 adicións e 37 borrados
  1. 46 37
      图形学/DirectX学习/README.md

+ 46 - 37
图形学/DirectX学习/README.md

@@ -595,6 +595,49 @@ D3D 除了创建交换链、设备外还会创建上下文(`Context`),用于
 
 这种设计允许高度的并行和效率,因为可以同时记录多个命令列表,而这些命令列表又可以在不同的线程中被创建和管理。此外,通过独立控制命令的记录和执行,DirectX 12 能够提供比以往更精细的控制和更优的性能
 
+#### 资源、描述符、描述符堆
+
+通过 `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):深度/模板视图
+
+**描述符**:是对资源的引用,存储在描述符堆中,用于高效的 GPU 访问
+
+**视图**:是资源的具体解释,定义了资源的使用方式(如读取、写入等),实际上通过描述符来创建
+
+描述符堆(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 在常规渲染流程中不需要由着色器直接访问,因为它们通常是由输出合并阶段使用
+
+在发出绘制命令之前,需要将本次绘制调用(`draw call`)相关的资源**绑定**(`bind`或`link`)到资源流水线上。部分资源可能在每次绘制调用时都会有所变化,所以每次按需更新绑定
+
+`GPU` 资源并非直接与流水线相绑定,而是通过**描述符**对象来间接引用,通过描述符 GPU 既能获取实际的资源数据,也能了解到资源的必要信息,即资源格式和如何使用
+
+使用描述符来表示资源是因为 GPU 资源实际上都是一些普通的内存块,很多时候只希望将部分数据绑定到渲染流水线,那么从整个资源中将其选出?或者内存块如何使用?这些都是记录在描述符中的
+
 ### 初始化项目
 
 封装报错宏
@@ -714,6 +757,8 @@ ThrowIfFailed(md3dDevice->CreateFence(0, D3D12_FENCE_FLAG_NONE, IID_PPV_ARGS(&mF
 
 9.  资源和视图
 
+以 `RTV`(`Render Target View`,**渲染目标视图**) 和 `DSV`(`Depth Stencil View`,**深度模板视图**) 为例
+
 ```cpp
 void D3DApp::CreateRtvAndDsvDescriptorHeaps()
 {
@@ -736,42 +781,7 @@ void D3DApp::CreateRtvAndDsvDescriptorHeaps()
 }
 ```
 
-以 `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):深度/模板视图
-
-**描述符**:是对资源的引用,存储在描述符堆中,用于高效的 GPU 访问
-
-**视图**:是资源的具体解释,定义了资源的使用方式(如读取、写入等),实际上通过描述符来创建
-
-描述符堆(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 在常规渲染流程中不需要由着色器直接访问,因为它们通常是由输出合并阶段使用
+由于不同平台描述符大小不同,所以通过特定接口获得描述符大小,并存储下来供未来使用
 
 ```cpp
 mRtvDescriptorSize = md3dDevice->GetDescriptorHandleIncrementSize(D3D12_DESCRIPTOR_HEAP_TYPE_RTV);
@@ -779,5 +789,4 @@ mDsvDescriptorSize = md3dDevice->GetDescriptorHandleIncrementSize(D3D12_DESCRIPT
 mCbvSrvUavDescriptorSize = md3dDevice->GetDescriptorHandleIncrementSize(D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV);
 ```
 
-由于不同平台描述符大小不同,所以通过特定接口获得描述符大小,并存储下来供未来使用