Ver Fonte

feat: 添加初始化说明

nicetry12138 há 1 ano atrás
pai
commit
4d99334b20

BIN
图形学/DirectX学习/Image/012.png


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

@@ -576,3 +576,60 @@ D3D 除了创建交换链、设备外还会创建上下文(`Context`),用于
 
 上下文分为即时和延迟俩种,当调用即时上下文时,会让硬件马上执行渲染工作;延迟上下文会建立指令集,然后将指令发布到即时上下文中,所以延迟上下文在多线程中表现良好
 
+#### 命令队列、命令列表、命令分配器
+
+图形编程时,CPU 和 GPU 都在参与处理工作,为了获得最佳性能,最好的情况就是让两者尽量同时工作
+
+![](Image/012.png)
+
+**命令队列**是一个接口,用于管理和调度待执行的命令列表。它负责接收提交的命令列表,并按照特定的顺序(如先入先出)将命令发送到 GPU 执行。命令队列可以是不同类型的,例如直接命令队列(用于大部分渲染和复制操作)、复制命令队列(专门用于复制操作)、计算命令队列(专门用于计算任务)
+
+> 当一系列命令被提交到命令队列时,并不会被 GPU 立即执行,GPU 可能正在处理先前插入的命令
+
+**命令分配器**是用于命令列表的内存管理。每个命令列表在记录命令之前都需要绑定一个命令分配器。命令分配器负责分配存储命令的内存空间。当命令列表被执行完毕后,可以重置命令分配器以回收内存资源,供未来的命令列表重用。重要的是,命令分配器在重置时必须确保没有任何与之相关的命令列表正在 GPU 上执行
+
+**命令列表**是记录所有渲染和计算命令的接口。开发人员使用命令列表来设置渲染状态、绑定资源和调度渲染命令等。命令列表在使用前需要与一个命令分配器关联,以获得所需的内存资源。完成命令的记录后,命令列表会被提交给命令队列进行执行
+
+- **命令分配器和命令列表**:每个命令列表在创建时都需要指定一个命令分配器。命令分配器为命令列表提供所需的内存资源。一个命令分配器可以与多个命令列表关联,但在任意时刻只能有一个命令列表与之关联。当命令列表执行完毕并且命令队列不再引用该命令列表时,可以重置命令分配器以供其他命令列表使用
+- **命令队列和命令列表**:命令列表记录完毕后,通过命令队列提交给 GPU 执行。命令队列负责安排这些命令的执行顺序,并确保它们被正确处理
+
+这种设计允许高度的并行和效率,因为可以同时记录多个命令列表,而这些命令列表又可以在不同的线程中被创建和管理。此外,通过独立控制命令的记录和执行,DirectX 12 能够提供比以往更精细的控制和更优的性能
+
+### 初始化项目
+
+需要**初始化窗口**和 **D3D 程序**
+
+初始化窗口其实就是前面封装的 `Window`,而 `DX12` 中初始化 `D3D` 需要依次创建 
+
+1. `DXGI` 工厂,用于创建设备和交换链,以及查询显卡(适配器)信息。
+2. `Device` 设备,图形驱动程序的接口。它用于创建所有的D3D资源,如纹理、缓冲区和命令列表
+3. `Command Queue`,命令队列,用于与设备通信的接口,用于提交执行命令列表
+4. `Swap Chain` 交换链,用于管理渲染数据缓冲区
+5. `Descriptor Heaps` 描述符堆,用于春初资源描述符的几何
+6. `Command Alloctor` 命令分配器,每个命令列表需要一个命令分配器用于管理内存
+7. `Command List` 命令列表,用于记录所以的渲染命令
+8. `Fence` 用于 CPU 和 GPU 之间的同步
+9. 资源和视图
+
+```cpp
+#ifndef ThrowIfFailed
+#define ThrowIfFailed(x)                                              \
+{                                                                     \
+    HRESULT hr__ = (x);                                               \
+    std::wstring wfn = AnsiToWString(__FILE__);                       \
+    if(FAILED(hr__)) { throw DxException(hr__, L#x, wfn, __LINE__); } \
+}
+#endif
+
+// 创建 DXGI 工厂
+ThrowIfFailed(CreateDXGIFactory1(IID_PPV_ARGS(&mdxgiFactory)));
+
+// 创建 Device
+HRESULT hardwareResult = D3D12CreateDevice(
+	nullptr,             // default adapter
+	D3D_FEATURE_LEVEL_11_0,
+	IID_PPV_ARGS(&md3dDevice));
+
+
+
+```

+ 2 - 0
图形学/DirectX学习/src/hd3d/hd3d/hd3d.vcxproj

@@ -109,6 +109,7 @@
       <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
       <FloatingPointModel>Fast</FloatingPointModel>
       <LanguageStandard>stdcpp17</LanguageStandard>
+      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
     </ClCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -128,6 +129,7 @@
       <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
       <LanguageStandard>stdcpp17</LanguageStandard>
       <FloatingPointModel>Fast</FloatingPointModel>
+      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
     </ClCompile>
     <Link>
       <SubSystem>Windows</SubSystem>