Een inleiding tot Direct3D-versies en compatibiliteit

UI Deze handleiding is bedoeld om de nuances van Direct3D en zijn versie / compatibiliteitsschema te helpen begrijpen. Het is verwarrend dat het niet allemaal om een ​​enkel nummer gaat, maar om een ​​paar dingen die het kopen van videokaarten vervelend kunnen maken.

 

Direct3D? Is het niet DirectX?

Dit is pedant, omdat ik weet dat sommige mensen graag pedant zijn. Direct3D is de eigenlijke 3D-versnellings-API waarnaar de meeste mensen verwijzen wanneer het over de DirectX-API in het algemeen gaat. DirectX is echt een familie van API voor game-ontwikkeling. Componenten van een moderne DirectX-familie omvatten (maar niet beperkt tot):

Direct2D
DirectCompute
XAudio2
XInput (vreemd genoeg wordt dit beschouwd als verouderd, omdat het onder DirectInput staat, dat werd beëindigd)
Maar aangezien Direct3D de enige is waar de meeste mensen om geven, hebben DirectX-versies de neiging om Direct3D-versies te volgen.

 

Wat moet een GPU doen om compatibel te zijn met een versie van Direct3D?

Microsoft heeft een lijst met functies die het systeem moet ondersteunen. Het maakt Microsoft niet uit hoe dit wordt geïmplementeerd, alleen dat het wordt geïmplementeerd. Een van de minimumvereisten voor Direct3D 9.0c is bijvoorbeeld dat de GPU Shader Model 3.0 moet ondersteunen. Ik zeg systeem, omdat sommige GPU’s op de een of andere manier niet over hardware-ondersteuning voor sommige functies beschikken, maar waarschijnlijk via stuurprogramma’s, ze kunnen ondersteunen via software. Intel’s GMA 900-serie is berucht voor de ondersteuning van Direct3D 9.0b, maar het ontbreekt aan een hardware transform & lighting engine.

 

Compatibiliteit met een Direct3D-versie komt neer op een checklist

Vóór Windows Vista, en dus Direct3D 10, werd de compatibiliteit gecontroleerd door te testen of de GPU in staat was tot bepaalde functies. Dit werd gecatalogeerd door middel van zogenaamde capability bits of “cap bits”. Dit is vergelijkbaar met de uitgebreide informatie- en featurebits bij het opvragen van de CPUID-informatie van de processor (zie https://en.wikipedia.org/wiki/CPUID#EAX=80000001h:_Extended_Processor_Info_and_Feature_Bits). Het probleem met cap-bits heeft ertoe geleid dat softwareontwikkelaars moeten mungelen met een aantal functies die de GPU al dan niet heeft ondersteund, ondanks dat ze “DirectX (sommige versie)” compatibel zijn. Dit was vooral een probleem in DirectX 9, waar er drie versies van waren en alle GPU’s die technisch ondersteund werden, verschillende functiesets hadden.

 

Cap-bits werden weggelaten in Direct3D 10. In plaats daarvan werd het functieniveau geïntroduceerd. Dit betekende dat de GPU moest worden beschouwd als een die Direct3D 10 ondersteunt, de GPU alle functies op een bepaald functieniveau moest ondersteunen of niet compatibel was met de API. Als een functieniveau hoger was dan een ander niveau, moest de GPU alle functies van de onderste ondersteunen. Toen Direct3D 10 werd gelanceerd, waren er aanvankelijk vier functieniveaus: 9_1, 9_2, 9_3 en 10_0. Dit vereenvoudigde sterk wat een ontwikkelaar moest ondersteunen of ondersteunen. Als ze bijvoorbeeld een Direct3D 10-game met functieniveau 10_0 (FL10_0) wilden ondersteunen, konden ze elk van de functies gebruiken die het bood, plus de lagere niveaus, en zolang de GPU FL10_0 compliant was, zou het werken.

 

Wat betekenen functieniveaus?

Hier is het verwarrende deel over de functieniveaus van Direct3D: om nieuwere versies van de API te ondersteunen, maar de compatibiliteit met oudere hardware te behouden, kunnen featurenniveaus levels met een nummer vóór het versienummer zelf hebben.

 

Direct3D 12 heeft bijvoorbeeld niet alleen twee eigen (FL12_0 en FL12_1), maar het heeft ook FL11_0 en FL11_1 (die van Direct3D 11 waren). Dit betekent dat elke GPU die FL11_0 ondersteunt, games kan uitvoeren met Direct3D 12 API, maar alleen met de functies die worden beschreven in FL11_0. Zelfs als de ontwikkelaar op FL12_0 of FL12_1 was gericht, moet elke GPU die geschikt is voor deze functieniveaus ook FL11_0- en FL11_1-functies ondersteunen, wat betekent dat het spel ook die functies moet hebben. Met andere woorden, voor Direct3D 12 ligt de basis op FL11_0-functies en wordt vanaf daar opgebouwd.

 

Merk echter op dat, omdat een GPU ondersteuning biedt op verschillende niveaus van Direct3D, dit niet betekent dat de GPU dit automatisch ondersteunt. De chauffeurs hebben er nog steeds iets aan te doen. De GeForce 400-serie is bijvoorbeeld FL11_0-compatibel, maar het is alleen goed voor Direct3D 11 en lager vanwege het gebrek aan ondersteuning voor stuurprogramma’s.

 

Betekenen functie-niveaus dat X GPU beter is dan Y GPU?

Niet noodzakelijk. De Maxwell van NVIDIA voldoet aan FL12_1, terwijl AMD’s GCN 3, de GPU-architectuur die hiertegen concurreert, slechts FL12_0 is. Het is verrassend dat Intel’s HD500 ook FL12_1 compliant is, maar ondersteunt nog meer functies dan NVIDIA Maxwell.

 

Er is ook het probleem dat de ontwikkelaar nog steeds een bepaald functieniveau moet targeten. Dus als een game gericht is op Direct3D 12, maar alleen gebruik maakt van de functies tot FL12_0, dan doet het kopen van een FL12_1-compatibele kaart niet veel.

 

Merk ook op dat een GPU meer kan ondersteunen dan wat de vereiste op het niveau vereist, maar waarschijnlijk niet zal worden gebruikt. Meerdere GPU’s hadden ondersteuning voor tessellation in hun eigen versies voordat Direct3D 11 het tot een vereiste maakte, maar het werd bijna nooit gebruikt in een game omdat de ontwikkelaars de functie kenden

 

Nog een ding…

Ik heb al eerder gezegd dat het Microsoft niet uitmaakt hoe een functie wordt geïmplementeerd. Alleen dat het het ondersteunt. Ik denk dat dit een bron van discussie was over het hele “asynchrone compute” debacle. Hier is een lijst met functieniveaus die Direct3D 12 ondersteunt en wat de GPU moet implementeren om compliant te zijn: https://msdn.microsoft.com/en-us/library/windows/desktop/mt186615(v=vs.85 ) .aspx Merk op dat de enige vermelding van “Compute” alleen maar zegt dat de GPU dit moet ondersteunen. En noch de tabel noch de pagina die het over compute heeft, heeft ergens het woord “asynchrone”.

 

In dit geval stelt Direct3D 12 meerdere wachtrijen bloot, maar hoe de hardware ze gebruikt, is aan de hardwarefabrikant. Meerdere wachtrijen zijn een functie, maar AMD’s Asynchronous Compute en NVIDIA’s Preemptive Shaders zijn implementatiedetails. Het zou slecht zijn voor Microsoft om te gaan “om deze functie te ondersteunen, moet je het op deze manier doen”, zelfs als er nog een dozijn andere manieren zijn om het te doen.

 

Bonus ding: Direct3D-versies en hun kenmerkniveaus

Direct3D 10
9_1, 9_2, 9_3, 10_0, 10_1 (impliceert dat een Direct3D 9 GPU compatibel is met Direct3D 10)
Direct3D 11
9_1, 9_2, 9_3, 10_0, 10_1, 11_0, 11_1 (impliceert dat een Direct3D 9 en 10 GPU compatibel is met Direct3D 11)
Direct3D 12
11_0, 11_1, 12_0, 12_1 (impliceert dat een Direct3D 11 GPU compatibel is met Direct3D 12)

Tags

About: ThermoFles

ThermoFles is een 34 jarige vader van 3 die elke dag bezig met het vergaren tech feitjes. Daarnaast beheert ThermoFles de teamspeak en minecraft server en is hij actief bezig met het onderhouden hiervan.

You may also like...

Sorry - Comments are closed

Join onze Discord

Flix & Chill