ik schrijf een klein hulpprogramma dat systeemmogelijkheden rapporteert. Een daarvan is het hoogste shader model dat ondersteund wordt door de geà nstalleerde grafische kaart, en ik detecteer dit op dit moment met behulp van Direct3D 9.0 C ‘ S apparaat mogelijkheden en het controleren van de VertexShaderVersion
en PixelShaderVersion
velden van de D3DCAPS9
structuur.
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);
echter, beide waarden retourneren shader model 3, zelfs voor kaarten die hogere modellen ondersteunen. Hier is wat GPU-Z retourneert voor dezelfde kaart, bijvoorbeeld:
deze vraag geeft aan dat DX9 nooit meer dan SM3 zal rapporteren, zelfs niet op kaarten die een hoger model ondersteunen, maar eigenlijk niet vermeldt hoe het op te lossen.
Hoe krijg ik het shader-model dat door de geïnstalleerde kaart wordt ondersteund? Dat wil zeggen, de kaart mogelijkheden, niet de geïnstalleerde DirectX driver mogelijkheden.
het hulpprogramma moet draaien op Windows 2000 en hoger, en werken op systemen waar een grafische kaart en zelfs DirectX niet zijn geïnstalleerd. Ik ben op dit moment dynamisch laden DX9, dus op die systemen de controle sierlijk mislukt (dat is ok.) Maar ik ben op zoek naar een soortgelijke oplossing: iets dat nog steeds zal draaien op alle systemen, en correct werken (detecteer de SM-versie) op de meeste systemen.
Edit – doel: Ik gebruik deze code niet om dynamisch eigenschappen van een programma te veranderen, dat wil zeggen select shaders. Ik gebruik het om hardwaremogelijkheden te rapporteren als een ‘ping’ naar een server, die gewend is dat we een goed idee hebben van typische hardware die onze klanten gebruiken, die toekomstige productbeslissingen kan informeren. (Bijvoorbeeld: hoeveel klanten hebben SM4 of hoger? Hoeveel gebruiken een 64-bit besturingssysteem? Etc.) Dit is de reden waarom ofwel (a) sierlijk falen, zodat we weten dat het is mislukt, of (b) het krijgen van een accuraat shader modelnummer zijn de twee voorkeursmodi.
Edit-answers so far: Het antwoord hieronder door SigTerm suggereert instantiating DirectX 11, 10.1, 10, en 9.0 c in volgorde, en gebaseerd op de gerapporteerde shader model op welke versie instantiated zonder fouten (shader model 5, 4.1, 4, en DXCAPS in die volgorde.) Indien mogelijk, ik zou waarderen een code voorbeeld van de DX11 en 10 manieren om dit te doen.
Dit is mogelijk geen betrouwbare oplossing. Bijvoorbeeld, Ik ben met Windows op een VMware Fusion virtuele machine op OSX. De Fusion drivers verslag DX11 in DxDiag, maar ik weet van de Fusion tech specs dat het alleen ondersteunt DX9. 0c en shader model 3. Toch, met deze uitzondering, deze methode lijkt de beste manier tot nu toe.