scriu un utilitar mic care raportează capacitățile sistemului. Unul este cel mai înalt model shader acceptat de placa grafică instalată și detectez în prezent acest lucru folosind capacitățile dispozitivului Direct3D 9.0 c și verific câmpurile VertexShaderVersion
și PixelShaderVersion
ale structurii 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);
cu toate acestea, ambele valori returnează modelul shader 3 chiar și pentru cardurile care acceptă modele superioare. Iată ce returnează GPU-Z pentru același card, de exemplu:
această întrebare indică faptul că DX9 nu va raporta niciodată mai mult decât SM3 chiar și pe carduri care acceptă un model superior, dar nu menționează de fapt cum să îl rezolve.
Cum obțin cu exactitate modelul shader acceptat de cardul instalat? Adică capacitățile cardului, nu capacitățile driverului DirectX instalate.
utilitarul trebuie să ruleze pe Windows 2000 și versiuni ulterioare și să funcționeze pe sisteme în care nu sunt instalate o placă grafică și chiar DirectX. În prezent, încărc dinamic DX9, așa că pe aceste sisteme verificarea eșuează grațios (ceea ce este ok.) Dar caut o soluție similară: ceva care va rula în continuare pe toate sistemele și va funcționa corect (detecta versiunea SM) pe majoritatea sistemelor.
Edit-purpose: nu folosesc acest cod pentru a schimba dinamic caracteristicile unui program, adică selectați shadere. Îl folosesc pentru a raporta capacitățile hardware ca ‘ping’ la un server, care este obișnuit să avem o idee bună despre hardware-ul tipic pe care îl folosesc clienții noștri, care poate informa deciziile viitoare ale produselor. (De exemplu: câți clienți au SM4 sau mai sus? Câți folosesc un sistem de operare pe 64 de biți? Etc.) Acesta este motivul pentru care fie (a) eșecul grațios, așa că știm că a eșuat, fie (b) obținerea unui număr precis de model shader sunt cele două moduri preferate.
Edit-answers până acum: răspunsul de mai jos de SigTerm sugerează instanțierea DirectX 11, 10.1, 10 și 9.0 c În ordine și bazându-se pe modelul shader raportat pe versiunea instanțiată fără eșecuri (modelul shader 5, 4.1, 4 și DXCAPS în această ordine.) Dacă este posibil, aș aprecia un exemplu de cod al DX11 și 10 moduri de a face acest lucru.
este posibil ca aceasta să nu fie o soluție fiabilă. De exemplu, rulez Windows pe o mașină virtuală VMware Fusion pe OSX. Driverele Fusion raportează DX11 în DxDiag, dar știu din specificațiile Fusion tech că acceptă doar DX9.0C și shader model 3. Totuși, cu această excepție, această metodă pare cea mai bună cale de până acum.