システム機能を報告する小さなユーティリティを書いています。1 つは、インストールされているグラフィックス カードでサポートされている最高のシェーダー モデルです。現在、Direct3D 9.0c のデバイス機能を使用してこれを検出し、構造体のVertexShaderVersion
およびPixelShaderVersion
フィールドをチェックしています。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 が同じカードに対して返すものは次のとおりです。たとえば、次のようになります。
この質問は、上位モデルをサポートするカードでも DX9 が SM3 以上を報告することは決してないことを示していますが、実際にそれを解決する方法については言及していません。
インストールされているカードでサポートされているシェーダー モデルを正確に取得するにはどうすればよいですか? つまり、インストールされている DirectX ドライバーの機能ではなく、カードの機能です。
このユーティリティは、Windows 2000 以降で実行する必要があり、グラフィック カードや DirectX さえもインストールされていないシステムで動作する必要があります。現在、DX9 を動的にロードしているため、これらのシステムではチェックが正常に失敗します (これは問題ありません)。しかし、同様の解決策を探しています。すべてのシステムで引き続き実行され、ほとんどのシステムで正しく動作する (SM バージョンを検出する)ものです。 .
編集 - 目的:プログラムの機能を動的に変更する、つまりシェーダーを選択するために、このコードを使用していません。私はこれを使用して、ハードウェア機能を「ping」としてサーバーに報告しています。これは、顧客が使用する典型的なハードウェアの良いアイデアを持っていることに慣れており、将来の製品決定を知らせることができます. (たとえば、SM4 以上を使用している顧客は何人ですか? 64 ビット OS を使用しているのは何人ですか? など) これが、(a) 正常に失敗したため、失敗したことがわかっているか、(b)正確なシェーダー モデルを取得している理由です。 number は 2 つの優先モードです。
編集 - これまでの回答: 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 とシェーダー モデル 3 のみをサポートしていることがわかります。それでも、この例外を除いて、この方法が今のところ最善の方法のようです。