文章目录
1、设备
1.1、设备对象
设备用于创建资源和枚举显示适配器的功能
每个设备可以使用一个或多个设备上下文,具体取决于所需的功能。
1.2、设备上下文
设备上下文包含使用设备的环境或设置。更具体地说,设备上下文用于设置管道状态并使用设备拥有的资源生成渲染命令。
1.2.1 即时上下文
device 和 ImmediateContext 一一对应。
直接上下文直接呈现给驱动程序。每个设备都有一个且只有一个可以从 GPU 检索数据的直接上下文。即时上下文可用于立即呈现(或回放)命令列表。
有两种方法可以获取即时上下文:
- 通过调用D3D11CreateDevice或D3D11CreateDeviceAndSwapChain。
- 通过调用ID3D11Device::GetImmediateContext。
1.2.2 延迟上下文
延迟上下文将 GPU 命令记录到命令列表中。延迟上下文主要用于多线程,单线程应用程序不需要。
延迟上下文通常由工作线程而不是主渲染线程使用。创建延迟上下文时,它不会从直接上下文继承任何状态。
要获取延迟上下文,请调用ID3D11Device::CreateDeferredContext。
任何上下文——立即或延迟——都可以在任何线程上使用,只要该上下文一次只在一个线程中使用。
1.3设备类型
D3D_DRIVER_TYPE
- D3D_DRIVER_TYPE_HARDWARE : 速度最快,在硬件中实现 Direct3D 功能
- D3D_DRIVER_TYPE_REFERENCE:参考驱动程序,它是支持每个 Direct3D 功能的软件实现。。参考驱动器是为精度而不是速度而设计的,因此速度慢但准确。
- D3D_DRIVER_TYPE_NULL :NULL 驱动程序,它是没有渲染功能的参考驱动程序。此驱动程序通常用于调试非渲染 API 调用。
- D3D_DRIVER_TYPE_SOFTWARE:一个软件驱动,就是一个完全用软件实现的驱动。由于其性能非常慢,该软件实现不适用于高性能应用程序。
- D3D_DRIVER_TYPE_WARP: WARP 驱动程序,它是一种高性能软件光栅化器。高级光栅化平台 (WARP) 。
1.4 WARP
高级光栅化平台 (WARP)
1.5 硬件
此图显示 Direct3D 11 如何支持新硬件和现有硬件。
在 Direct3D 11 中,引入了一种称为功能级别的新范式。功能级别是一组明确定义的 GPU 功能。使用功能级别,您可以将 Direct3D 应用程序定位为在 Direct3D 硬件的下层版本上运行。
功能级别
描述 Direct3D 设备所针对的一组功能。
typedef enum D3D_FEATURE_LEVEL {
D3D_FEATURE_LEVEL_1_0_CORE,
D3D_FEATURE_LEVEL_9_1,
D3D_FEATURE_LEVEL_9_2,
D3D_FEATURE_LEVEL_9_3,
D3D_FEATURE_LEVEL_10_0,
D3D_FEATURE_LEVEL_10_1,
D3D_FEATURE_LEVEL_11_0,
D3D_FEATURE_LEVEL_11_1,
D3D_FEATURE_LEVEL_12_0,
D3D_FEATURE_LEVEL_12_1,
D3D_FEATURE_LEVEL_12_2
} ;
2、资源
通常,资源包括纹理数据、顶点数据和着色器数据。
您可以创建强类型或无类型的资源;您可以控制资源是否具有读写权限;您可以使资源仅可由 CPU、GPU 或两者访问。每个流水线阶段最多可以有 128 个资源处于活动状态。
Direct3D 资源的生命周期是:
- 使用ID3D11Device接口的创建方法之一创建资源。
- 使用上下文和ID3D11DeviceContext接口的设置方法之一将资源绑定到管道。
- 通过调用资源接口的Release方法来释放资源。
全类型和无类型
- Typed - 完全指定类型在创建资源时。
- Typeless - 完全指定资源类型在绑定到管道时。
资源视图(Views)
资源可以以通用存储器格式存储,以便它们可以由多个流水线阶段共享,管道阶段使用视图解释资源数据。资源视图在概念上类似于转换资源数据,以便它可以在特定上下文中使用。
视图还公开了其他功能,例如在着色器中回读深度/模板表面的能力,在单次传递中生成动态立方体贴图,以及同时渲染到体积的多个切片。
Raw Views of Buffers
shader resource view (SRV)
unordered access view (UAV)
资源的限制
具体查看
https://docs.microsoft.com/en-us/windows/win32/direct3d11/overviews-direct3d-11-resources-limits
子资源
缓冲区被定义为单个子资源
Buffers
缓冲区包含用于描述几何、索引几何信息和着色器常量的数据。
缓冲区资源是分组为元素的完全类型化数据的集合。您可以使用缓冲区来存储各种数据,包括位置向量、法线向量、顶点缓冲区中的纹理坐标、索引缓冲区中的索引或设备状态。一个缓冲区元素由 1 到 4 个组件组成。缓冲区元素可以包括打包数据值(如 R8G8B8A8 表面值)、单个 8 位整数或四个 32 位浮点值。
顶点缓冲区
顶点缓冲区包含用于定义几何的顶点数据。顶点数据包括位置坐标、颜色数据、纹理坐标数据、法线数据等。
顶点缓冲区包含完全指定 3D 顶点所需的所有数据。这方面的一个例子可能是一个包含每个顶点位置、法线和纹理坐标的顶点缓冲区。这些数据通常被组织为一组逐顶点元素,如下图所示
D3D11_BUFFER_DESC bd;
memset(&bd, 0, sizeof(D3D11_BUFFER_DESC));
bd.ByteWidth = sizeof(s_vertex);
bd.Usage = D3D11_USAGE_DEFAULT;
bd.BindFlags = D3D11_BIND_VERTEX_BUFFER;
bd.CPUAccessFlags = 0u;
bd.MiscFlags = 0u;
bd.StructureByteStride = sizeof(Vertex);
D3D11_SUBRESOURCE_DATA sd = {
};
sd.pSysMem = s_vertex;
HRESULT hr = winD3D11Context->getDevice()->CreateBuffer(&bd, &sd, &m_pVertextBuffer);
索引缓冲区
索引缓冲区包含顶点缓冲区的整数偏移量,用于更有效地渲染图元。索引缓冲区包含一组连续的 16 位或 32 位索引;每个索引用于标识顶点缓冲区中的一个顶点。索引缓