Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何检测图形卡支持的v3以上的DirectX着色器模型?_Directx_Shader Model - Fatal编程技术网

如何检测图形卡支持的v3以上的DirectX着色器模型?

如何检测图形卡支持的v3以上的DirectX着色器模型?,directx,shader-model,Directx,Shader Model,我正在编写一个报告系统功能的小实用程序。其中一个是安装的图形卡支持的最高着色器模型,我目前正在使用并检查D3DCAPS9结构的VertexShaderVersion和PixelShaderVersion字段来检测这一点 HRESULT hrDCaps = poD3D9->GetDeviceCaps(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, &oCaps); if (!FAILED(hrDCaps)) { // Pixel and ve

我正在编写一个报告系统功能的小实用程序。其中一个是安装的图形卡支持的最高着色器模型,我目前正在使用并检查
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-Z为同一卡返回的内容,例如:

表示即使在支持更高型号的卡上,DX9也不会报告超过SM3的数据,但实际上并未提及如何解决该问题

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

该实用程序必须在Windows 2000及以上版本上运行,并且在未安装图形卡甚至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 Fusion虚拟机上运行Windows。Fusion驱动程序在DxDiag中报告DX11,但我从Fusion技术规格中知道它。不过,除了这个例外,这种方法似乎是目前为止最好的方法。

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

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

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

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

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

其中未安装图形卡甚至DirectX


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

这里是关于DirectX版本和支持的着色器模型的。

如果需要D3D10功能,尝试获取10个上下文并检查功能集是最好的方法。OpenGL着色器功能不一定映射到D3D(许多较旧的驱动程序更好地支持D3D),保留查找表只会导致问题和误报/误报。尝试在第一次运行时创建一个D3D9/10上下文并检查caps并不是非常慢,而且非常可靠。请确保不要将您的程序链接到D3D10(否则它将无法在没有它的系统上运行,请使用LoadLibrary)。谢谢SigTerm和@peachykeen。“版本4仅在Direct3D10上受支持。因此,D3D9API不会报告它。”我从链接的问题中总结了这一点。如何“使用D3D10/D3D11 api检测更高版本”?(相信我,我用谷歌搜索过,D3D10在获取功能、检测着色器模型等方面没有任何结果。我也找不到从MSDN中的D3D10设备创建方法开始的任何内容,等等)也就是说,你可以写一个方法名作为指向google的指针,或者更好的是写一个代码段,拜托?@DavidM:看起来他们在D3D10中删除了设备封顶,所以所有D3D10卡都支持所有D3D10功能。看起来D3D10支持SM4,D3D10.1支持4.1,D3D11支持SM5。所以。。。您尝试按顺序实例化DX11、DX10.1和DX10,并从中导出着色器模型版本?一个问题是,我在VMWare Fusion上运行Windows,根据GPU-Z,它支持DX11,但只支持shader model 3。@DavidM:我就是这样做的。我不使用D3D10,但我猜这种行为会使卡不符合标准(或者GPU-Z有一个bug)。您还可以使用
dumpbin/imports
调查GPU-Z可执行文件,并查看它实际调用了什么。但这将是一个灰色地带/可能违反许可条款(不确定)。或者搜索可以做同样事情的开源项目并将其拆分。请注意,即使硬件支持SM4+,您也无法使用D3D9中的大部分。有一些奇怪的驱动程序功能类似于D3D10的后端口功能(比如AMD的R2VB扩展),但是你不能只在D3D9中加载SM4着色器。谢谢。我不想用它-我想知道它是否可用。当我们知道x%的客户可以使用它时,使用它会在以后出现,因此值得编写代码。收集这些数据就是这个小工具的用途。