问题标签 [shader-model]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
4555 浏览

directx - 如何检测显卡支持的 v3 以上的 DirectX 着色器模型?

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

但是,即使对于支持更高模型的卡,这两个值都会返回着色器模型 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。尽管如此,除了这个例外,这种方法似乎是迄今为止最好的方法。