Direct3D 和 DXGI 之间的区别

Difference between Direct3D and DXGI

我正在尝试使用 C++ 查询 Windows 机器以获取可用显卡列表。

这个 SO 问题有一个答案(来自 moxize),它提供了一种方法 (d3d9.h): get-the-graphics-card-model

而这个提供了另一个 (dxgi.h):dxgi enumadapters

当我尝试每一个时,我发现上面的 dxgi 方法列出了 所有 卡,而 d3d9 似乎只提供了 一个它们,取决于 NVIDIA 控制面板中 "preferred graphics processor" 的选择。

我很难理解上述每条程序化路线提供的内容和用途之间的区别?

Vista 引入了 DirectX 图形基础结构 (DXGI)。它基本上将所有枚举、显示和适配器管理以及 Direct3D 中的表示内容都考虑在内。这样,各种图形 API 就可以共存,而无需在每个图形中为这些常见任务设置单独的机制。例如,它允许所有 Direct3D APIs (>= 10) 只关心将 3D 内容绘制到缓冲区中,而不关心这些缓冲区来自何处,或者它们是否以及如何显示。

旧的 Direct3D 9 API 仍然有自己的适配器枚举接口。如果我没记错的话,Direct3D 9 过去只枚举实际连接了显示器的适配器。很可能是因为 API 并不真正支持无头渲染,所以尝试使用没有输出的适配器是没有意义的。另一方面,DXGI 在您的机器上对整个 video and present network 的更完整的画面进行操作。最重要的是,它区分适配器(图形卡)和输出(连接到适配器的显示器)。我假设您 运行 在笔记本电脑或其他具有集成和专用 GPU 的机器上!?在驱动程序控制面板中切换 "preferred graphics processor" 很可能会改变两个 GPU 中的哪一个(逻辑上)连接到显示器。然后 Direct3D 9 将始终只枚举那个……