私はシステム機能を報告する小さなユーティリティを書いています。 現在、Direct3D9.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-Zが返すものは次のとおりです。:
この質問は、より高いモデルをサポートするカードでさえ、DX9がSM3以上を報告することはないことを示していますが、実際にはそれを解決する方法に
インストールされているカードでサポートされているシェーダーモデルを正確に取得するにはどうすればよいですか? つまり、インストールされているDirectXドライバの機能ではなく、カードの機能です。
このユーティリティはWindows2000以上で動作し、グラフィックスカードやDirectXがインストールされていないシステムで動作する必要があります。 私は現在、DX9を動的にロードしているので、これらのシステムではチェックが正常に失敗します(これはokです。 しかし、私は同様の解決策を求めています:すべてのシステムで実行され、ほとんどのシステムで正しく動作する(SMバージョンを検出する)もの。
編集目的:プログラムの機能を動的に変更するためにこのコードを使用していません。 これは、お客様が使用する典型的なハードウェアの良いアイデアを持っているために使用され、将来の製品の決定を通知することができます。 (例えば: どのように多くの顧客がSM4以上を持っていますか? 64ビットOSを使用している人は何人いますか? など。)これが、(a)正常に失敗したため、失敗したことがわかっているか、(b)正確なシェーダモデル番号を取得することが2つの推奨モードです。
編集-これまでの回答:SigTermによる以下の答えは、DirectX11、10.1、10、および9.0cを順番にインスタンス化し、報告されたシェーダーモデルを失敗せずにインスタン 可能であれば、DX11のコード例とこれを行う10の方法に感謝します。
これは信頼できる解決策ではないかもしれません。 たとえば、OSX上のVMWare Fusion仮想マシンでWindowsを実行しています。 Fusion driversはDXDIAGでDX11を報告していますが、Fusion techの仕様から、DX9.0cとshader model3のみをサポートしていることがわかります。 それでも、この例外を除いて、この方法はこれまでのところ最良の方法と思われます。