piszę małe narzędzie, które zgłasza możliwości systemu. Jednym z nich jest najwyższy model shader obsługiwany przez zainstalowaną kartę graficzną, a obecnie wykrywam to za pomocą możliwości urządzenia Direct3D 9.0 c i sprawdzam pola VertexShaderVersion
i PixelShaderVersion
struktury 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);
jednak obie te wartości zwracają shader model 3 nawet dla kart obsługujących wyższe modele. Oto co GPU-Z zwraca dla tej samej karty, na przykład:
to pytanie wskazuje, że DX9 nigdy nie zgłosi więcej niż SM3 nawet na kartach obsługujących wyższy model, ale w rzeczywistości nie wspomina, jak go rozwiązać.
jak dokładnie uzyskać model shadera obsługiwany przez zainstalowaną kartę? Oznacza to, że możliwości karty, a nie zainstalowane możliwości Sterownika DirectX.
narzędzie musi działać w systemie Windows 2000 i powyżej i działać na systemach, w których nie jest zainstalowana karta graficzna, a nawet DirectX. Obecnie dynamicznie Ładuję DX9, więc na tych systemach sprawdzanie się nie udaje (co jest ok.) Ale szukam podobnego rozwiązania: czegoś, co nadal będzie działać na wszystkich systemach i działa poprawnie (wykrywa wersję SM) na większości systemów.
edit – purpose: nie używam tego kodu do dynamicznej zmiany funkcji programu, tj. select shaders. Używam go do zgłaszania możliwości sprzętowych jako „ping” do serwera, który jest używany, aby mieć dobry pomysł na typowy sprzęt, z którego korzystają nasi klienci, który może informować o przyszłych decyzjach dotyczących produktu. (Na przykład: ilu klientów ma SM4 lub wyższy? Ilu korzysta z 64-bitowego systemu operacyjnego? Itd.) Dlatego albo (a) z wdziękiem zawodzi, więc wiemy, że się nie powiodło, albo (b)uzyskanie dokładnego numeru modelu shadera to dwa preferowane tryby.
Edit – answers so far: the answer below by SigTerm suggests instantiation DirectX 11, 10.1, 10, and 9.0 c in order, and basing the reported shader model on which version instantiated without failures (shader model 5, 4.1, 4, and dxcaps in that order.) Jeśli to możliwe, byłbym wdzięczny za przykład kodu DX11 i 10 sposobów, aby to zrobić.
to może nie być niezawodne rozwiązanie. Na przykład używam systemu Windows na maszynie wirtualnej VMware Fusion NA OSX. Sterowniki Fusion zgłaszają DX11 w DxDiag, ale wiem ze specyfikacji technicznej Fusion, że obsługuje tylko DX9. 0c i shader model 3. Mimo to, z tym wyjątkiem, ta metoda wydaje się najlepszym sposobem do tej pory.