我正在编写一个报告系统功能的小实用程序。一个是安装的显卡支持的最高的着色器模型,我目前正在使用Direct3D 9.0c的设备功能检测这个模型,并检查D3DCAPS9结构的VertexShaderVersion和PixelShaderVersion字段。
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为同一张卡返回的内容,例如:

这个问题指出,即使在支持更高模型的卡上,DX9也不会比SM3报告更多,但实际上没有提到如何解决这个问题。
如何准确地获得已安装的卡片支持的着色器模型?,即卡功能,而不是已安装的DirectX驱动程序功能。
该实用程序必须在Windows2000及更高版本上运行,并在没有安装显卡甚至DirectX的系统上工作。我目前正在动态加载DX9,因此在这些系统上检查会失败(这是可以的)。但是我正在寻找一个类似的解决方案:在所有系统上仍然运行的东西,并且在大多数系统上正确工作(检测SM版本)。
编辑用途:我不使用这段代码动态地更改程序的特性(选择着色器)。我使用它将硬件功能作为“ping”报告给服务器,这习惯于我们对客户使用的典型硬件有一个很好的了解,这可以为未来的产品决策提供信息。(例如:有多少客户拥有SM4或以上?有多少人使用64位操作系统?(等等)这就是为什么要么(a)优雅地失败,所以我们知道它失败了,或者(b)获得一个准确的着色模型号码是两种首选模式。
编辑--到目前为止的答案: SigTerm下面的答案建议按顺序实例化DirectX 11、10.1、10和9.0c,并将所报告的着色器模型建立在没有失败的实例化版本的基础上(着色器模型5、4.1、4和DXCAPS )。如果可能的话,我希望有一个DX11的代码示例和10种方法来做到这一点。
这可能不是一个可靠的解决办法。例如,我在OSX上的VMWare融合虚拟机上运行Windows。融合驱动程序在DxDiag中报告了DxDiag,但我从融合技术规范中知道它是只支持DX9.0c和着色器型号3。不过,除了这个例外,这个方法似乎是目前为止最好的方法。
发布于 2013-08-02 14:22:33
版本4只支持在Direct3D10上。因此,D3D9 api不会报告它。使用D3D10/D3D11API检测更高版本。
仍将在所有系统上运行并在大多数系统上正确工作(检测SM版本)的东西。
尝试初始化D3D10/D3D11以检查功能,如果它在D3D9中失败了。使用LoadLibrary + GetProcAddress加载D3D10函数,因为如果使用.lib文件与D3D10链接,如果缺少d3d10,则应用程序将无法启动。
或者使用OpenGL并尝试将OpenGL报告的功能映射到D3D功能(可能是一个非常糟糕的主意)。
或者建立GPU数据库并使用它。
如果没有安装显卡,甚至没有安装DirectX。
我认为你要求的是不可能的,因为着色器是由DirectX提供的,而驱动程序/图形处理器甚至可能没有遮罩下的“着色器模型”的概念。在这种情况下,检测能力的唯一方法是创建某种类型的GPU数据库,检测已安装的设备,并从数据库返回答案。当然,这是不可靠的。
发布于 2014-03-18 17:37:47
这里是一个链接关于DirectX版本和支持的着色器模型。
https://stackoverflow.com/questions/18016179
复制相似问题