4

我正在编写一个报告系统功能的小实用程序。一种是安装的显卡支持的最高着色器模型,我目前正在使用Direct3D 9.0c 的设备功能检测到这一点,并检查结构的VertexShaderVersionPixelShaderVersion字段D3DCAPS9

HRESULT hrDCaps = poD3D9->GetDeviceCaps(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, &oCaps);
   if (!FAILED(hrDCaps)) {
      // Pixel and vertex shader model versions. Use the minimum number of each for "the" shader model version
      const int iVertexShaderModel = D3DSHADER_VERSION_MAJOR(oCaps.VertexShaderVersion);
      const int iPixelShaderModel = D3DSHADER_VERSION_MAJOR(oCaps.PixelShaderVersion);

但是,即使对于支持更高模型的卡,这两个值都会返回着色器模型 3。这是 GPU-Z 为同一张卡返回的结果,例如:

GPU-Z 显示着色器模型 4.1

这个问题表明DX9即使在支持更高型号的卡上也永远不会报告超过SM3,但实际上并没有提及如何解决它。

如何准确获取已安装卡支持的着色器型号? 也就是说,卡功能,而不是安装的 DirectX 驱动程序功能。

该实用程序必须在 Windows 2000 及更高版本上运行,并且可以在未安装显卡甚至 DirectX 的系统上运行。我目前正在动态加载 DX9,因此在这些系统上检查正常失败(没关系。)但我正在寻找类似的解决方案:仍然可以在所有系统上运行,并且在大多数系统上正常工作(检测 SM 版本).


编辑 - 目的:我没有使用此代码来动态更改程序的功能,即选择着色器。我使用它来将硬件功能报告为服务器的“ping”,这使我们对客户使用的典型硬件有一个很好的了解,这可以为未来的产品决策提供信息。(例如:有多少客户拥有 SM4 或更高版本?有多少人使用 64 位操作系统?等等。)这就是为什么(a)正常失败,所以我们知道它失败了,或者(b)获得准确的着色器模型number 是两种首选模式。

编辑 - 到目前为止的答案:SigTerm 下面的答案建议按顺序实例化 DirectX 11、10.1、10 和 9.0c,并将报告的着色器模型基于哪个版本实例化而没有失败(着色器模型 5、4.1、4 和 DXCAPS 在这个顺序。)如果可能的话,我会很感激 DX11 的代码示例和 10 种方法来做到这一点。

这可能不是一个可靠的解决方案。例如,我在 OSX 上的 VMWare Fusion 虚拟机上运行 Windows。Fusion 驱动程序在 DxDiag 中报告 DX11,但我从 Fusion 技术规范中知道它仅支持 DX9.0c 和 shader model 3。尽管如此,除了这个例外,这种方法似乎是迄今为止最好的方法。

4

2 回答 2

5

版本 4 仅在 Direct3D10 上受支持。因此,D3D9 api 不会报告它。使用 D3D10/D3D11 api 检测更高版本。

仍然可以在所有系统上运行的东西,并且在大多数系统上都能正常工作(检测 SM 版本)。

如果初始化 D3D9 失败,则尝试初始化 D3D10/D3D11 以检查功能。使用 LoadLibrary + GetProcAddress 加载 D3D10 函数,因为如果您使用 .lib 文件与 D3D10 链接,如果缺少 d3d10,您的应用程序将无法启动。

或者使用 OpenGL 并尝试将 OpenGL 报告的功能映射到 D3D 功能(可能是一个非常糟糕的主意)。

或者建立 GPU 数据库并使用它。

没有安装显卡甚至 DirectX 的地方。

我认为您要求的是不可能的,因为 DirectX 提供了着色器,并且驱动程序/GPU 甚至可能没有引擎盖下的“着色器模型”的概念。在这种情况下,检测能力的唯一方法是制作某种 GPU 数据库,检测已安装的设备,并从数据库中返回答案。当然,这不会是可靠的。

于 2013-08-02T14:22:33.767 回答
1

这是有关 DirectX 版本和支持的着色器模型的链接。

于 2014-03-18T17:37:47.677 回答